laravel 5.6 Eloquent : eloquent 关系模型创建问题

laravel 5.6 Eloquent : eloquent relationship model creation issue

在我的控制器中,我通过关系创建了一个 Eloquent 模型实例传递。该模型加载在控制器的 __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() 始终为空,如果我重新加载页面,dd() 会正确显示我的图库模型。 事情对我来说很奇怪,似乎是第一次创建完成但还没有准备好......我可以变通,但为什么这段代码第一次不起作用? 非常感谢帮助。

关系代码:在图库中 ....

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

店内...

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

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

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

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

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

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

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

当使用$this->store->gallery()->create()方法时,原来的方法没有用新值进行水化,你可以简单地做一个

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

$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',
]);

瞧!您的图库已准备就绪,可供使用:)