雄辩的-如何在没有观察者的情况下等到create()之后

时间:2019-07-16 13:33:43

标签: php laravel wait

错误

  

在null上调用成员函数media()

场景

我有几个相关的模型。我有一个“事件”模型。 (通过1到1)附加的是Gallery模型。 (通过一对多)附加的是“媒体”模型。在活动的“创建者”观察者中,我尝试附加其画廊。我可以毫无问题地创建图库,但是当我尝试将媒体连接到它时,会出现上述错误。

我的代码

if ($model->gallery === null) {
   $this->createGallery($model);
}

// product images or banner images
$file = Storage::put("public/event_images/", $image);
$file = str_replace("public/event_images/", "", $file);
$file = "/" . $file;

$model->gallery->media()->create([
    "path" => $file,
    "type" => "image"
]);

// The createGallery() function
private function createGallery($model)
{
    $model->gallery()->create();
}

因此,我知道要解决此问题,我必须“等待” ,直到创建图库为止,然后再尝试访问其关系。但是我不知道该怎么做。这段代码在第二次运行时有效,表明确实创建了图库-在代码到达media()之前还不够快。

2 个答案:

答案 0 :(得分:2)

PHP是一种同步编程语言,因此不必等待完成。

问题在于您已经加载了该关系,并且直到再次加载该关系后,该关系才会重新验证。可以使用load() function完成。

更改代码以创建画廊:

if ($model->gallery === null) {

    // Create the related model
    $this->createGallery($model);

    // Load the relation again
    $model->load('gallery');
}

答案 1 :(得分:2)

我认为您可能需要在尝试访问模型关系之前刷新模型。在尝试将图像附加到图库之前,请尝试$model->refresh()。像

if ($model->gallery === null) {
   $this->createGallery($model);
   $model->refresh();
}

否则该模型将不会意识到新创建的图库。