2015-04-17 65 views
2

laravel,我已經建立了一對多的關係,我可以使用saveMany函數保存關係。Laravel雄辯地更新一對多關係

$post->comment()->saveMany($array); 

的問題是:

如何Laravel自動刪除未使用的註釋,僅存儲到數據庫中的最新評論?

例如。 首次

ID 1 Post has ID 1, ID2, ID 3 comment. 

然而,當我後來更新的關係,

ID 1 Post only has ID 2, ID 3 comment 

如何laravel自動刪除ID 1 comments?並在表格中留下ID 2, 3? 謝謝

回答

0

使用saveMany(),您將附加新實體並自動將外鍵設置爲父項(設置$comment->post_id = $post->id;存儲它們時)。這只是爲了附加它們,因爲您聲明評論總是與帖子相關。一對多定義您的帖子有很多評論,評論屬於該帖子,由評論中的post_id定義。

除非你想要與帖子無關的評論,這是沒有意義的,我會說你不應該從評論中取消post_id,但如果你想擺脫它們只是刪除評論。 但是,如果你這樣做,嘗試$comment->dissociate(),它會取消父密鑰。這就像在許多人身上使用detach()

+0

問題是laravel不會刪除無關的評論,當我使用再次保存很多。不相關的評論仍然保留在數據庫中的父鍵,我該如何擺脫它? – user2617403

+0

'saveMany()'只添加新項目,它不會刪除它們。爲了取消設置父級使用@ zub0r的例子,或者像上面所說的那樣使用'$ comment-> dissociate()'。如果你想一直刪除它們而不是取消設置關係並保存它,只需在foreach循環中調用'$ comment-> delete();'。 – Robert

0

沒有detach()方法像許多一對多的關係,但你可以做

// detach old first 
$post->comment()->get()->each(function($comment) use ($array){   
    if (!in_array($comment, $array)) 
    // if (!$array->contains($comment)) in case of collection 
    { 
     $comment->post_id = null; 
     $comment->save(); 
    }   
}); 

// attach new ones 
$post->comment()->saveMany($array); 

希望這有助於。