php Laravel“make”关系

pwuypxnk  于 5个月前  发布在  PHP
关注(0)|答案(1)|浏览(39)

我在Laravel版本10中尝试创建关系示例,而不将它们持久化到数据库中,直到调用save()
我有类似以下的东西。

$detail = OrderDetail::make([
    'example' => 'example',
]);

$detail->imprints()->make(['imprintID' => 1]);

// ... Other code is executed

$detail->save(); // Should persist the detail and the imprint

字符串
我已经尝试了一些不同的东西,前提是我希望OrderDetail模型能够知道印记,因为OrderDetail在最终持久化到数据库中之前会被传递给几个不同的类。
有没有一种方法可以在不建立自己的关系结构的情况下实现这一点?
imprints方法很简单,

class OrderDetail extends Model{

    public function imprints(): HasMany
    {
        return $this->hasMany(OrderDetailImprint::class);
    }
}

b4wnujal

b4wnujal1#

正如@lagbox所说的那样,而且通过我自己的研究,似乎没有一种优雅的方法可以将非持久化的相关模型推到父模型上。
所以在匆忙中,我在我的BaseModel上总结了我自己的解决方案,如下所示。

abstract class BaseModel extends Model
{

    /**
     * Stores models that are related to this model but aren't yet
     * persisted to the databse
     * @var array
     */
    private $relatedMakeModels = [];

    /**
     * Store related models to be saved along with the model.
     * @param Model $model The related model to be saved
     * @param string $relationFunction The function name to call.
     */
    public function makeRelatedModel(Model $model, string $relationFunction): Model
    {
        $this->relatedMakeModels[] = [
            'model' => $model,
            'relation_function' => $relationFunction,
        ];
        return $model;
    }

    /**
     * Override.
     * Save the model to the database.
     * @param array $options
     * @return bool
     */
    public function save(array $options = []): bool
    {
        $result = parent::save($options);

        foreach ($this->relatedMakeModels as $model) {
            $this->{$model['relation_function']}()->save($model['model']);
        }

        $this->relatedMakeModels = [];

        return $result;
    }
}

字符串
我不会接受这个答案,因为我仍然相信在Laravel中应该有一种方法可以做到这一点。

相关问题