laravel 5.6雄辩:雄辩的关系模型创建问题

时间:2018-10-29 10:27:33

标签: laravel eloquent relation

在我的控制器中,我通过一个关系创建了一个雄辩的模型实例。该模型加载在控制器的__construct上,这就是为什么存在$ this-> store而不是$ store的原因。

public function index()
{
    if (is_null($this->store->gallery)) {
        $this->store->gallery()->create([
            'title'       => 'gallery_title,
            'description' => 'gallery_description',
        ]);
    }
    $gallery = $this->store->gallery;
    dd($gallery);
    return view('modules.galleries.index', compact('gallery'));
}

如果商店的画廊还不存在,那就创建它吧。

我第一次打印出dd()总是为null,如果我重新加载页面,则dd()可以正确显示我的画廊模型。 事情对我来说很奇怪,似乎是第一次完成创建但还没有准备好……我可以解决,但是为什么这段代码第一次不起作用? 帮助非常感谢。

关系代码:在画廊上。

public function store()
{
    return $this->belongsTo(Store::class);
}

在商店...

public function gallery()
{
    return $this->hasOne(Gallery::class);
}

2 个答案:

答案 0 :(得分:0)

这是Eloquent的延迟加载部分。基本上,当您使用is_null($this->store->gallery)对其进行测试时,会将其设置为该值。

当您尝试再次恢复它时,它没有执行数据库查询,它只是加载了已经存在的值(null)。

创建后,您需要强制重新加载关系:

$this->store->load('gallery');

unset($this->store->gallery);

$gallery = $this->store->gallery()->get();

答案 1 :(得分:0)

使用$this->store->gallery()->create()方法时,原始方法不会与新值混合,您只需执行

$gallery = $this->store->refresh()->gallery;

OR

$gallery = $this->store->load('gallery')->gallery;

如果您想使代码更清洁,可以在商店模型中进行:

public function addGallery($gallery){

    $this->gallery()->create($gallery);

    return $this->load('gallery')->gallery;
}

在您的控制器中:

$gallery = $this->store->addGallery([
    'title'       => 'gallery_title',
    'description' => 'gallery_description',
]);

,瞧!您已准备好使用图库:)