2016-11-16 98 views
1

有人可以澄清一下嗎?我以前用過Model Events很多次,但似乎我還沒有嘗試訪問最初「創建」事件上的任何相關模型。在創建的模型事件中無法訪問關係?

例如,我有一個M2M關係兩種型號對方:

Book() public function authors() 
Author() public function books() 

我救了一個新的Book對象,與相關作者,其他地方在我的代碼,並通過挖掘「創造」或「保存」人體模特兒事件(在EventServiceProvider.php),我希望能夠在同一時間像這樣以更新相關對象的某些字段:

Book::created(function($book) { 
    $authors = $book->authors; 
    foreach($authors as $a){ 
     $a->books_authored += 1; 
     $a->save(); 
    } 
}); 

..但我不能,因爲$ authors調用返回沒有相關的對象。如果這是通常的行爲(我在這裏沒有做過不正確的事情)?有沒有辦法在初始創建/保存事件中訪問這些關係?

在此先感謝。

回答

0

我認爲你遇到的問題是創建的事件在你附加作者之前發射。您還沒有連接你的代碼,但我假設:

Book::create(['title' => 'Foo'])->author()->save(new Author['name' => 'Brian']); 

這實際上是以下幾點:

$book = Book::create(['title' => 'Foo']) // Book created event fired 
$relation = $book->author(); // Relation retrieved 
$relation->save(new Author['name' => 'Brian']); //related author attached 

,當你在功能上附加一個作家你或許應該手動觸發一個事件你的書籍模型,例如

class Book extends Eloquent 
{ 
    public function saveAuthor($author) { 
     if($this->save($author)) { 
      Event::fire(new AuthorWasAttached($this, $author)); 
     } 
    } 
} 

然後做你的處理在AuthorWasAttached事件類

This may be of help.

+0

我已經澄清了我上面的原始問題。現在希望它更容易理解。 – Daryl

+0

請添加顯示如何創建圖書並將其鏈接到作者的代碼。你添加的內容不會改變我的答案。 – AlexW

+0

你們都很正確。 「創建」事件在作者被附加之前觸發,因此相關項目尚未提供。我已經忘記了一個新對象必須在任何相關對象附加到它之前實例化。謝謝。 – Daryl

0

您創建書本對象,然後;

$author=new Author(['name'=>'Joo']); 
$book->authors()->save($author); 
+0

我不希望創建新對象的作者,我希望訪問已經在圖書中創建的作者的關係: :創建模型事件並更新其中的一些字段。 – Daryl