簡體   English   中英

如何在數據透視表中使用雄辯的“ saveMany”?

[英]How to use Eloquent 'saveMany' with pivot table?

在Laravel中,我有一個用戶表和一個通知表,處於多對多關系。 每個通知都分配給一組用戶,每個用戶可以將通知標記為已獨立閱讀。 中間表(notice_user_map)為此具有一個“讀”列。

我正在嘗試創建“全部標記為已讀”功能,但看不到如何通過Eloquent做到這一點。 這是基本代碼:

$notices = $user->notices()
    ->where('read', 0)
    ->get();

foreach ($notices as $notice) {
    $notice->pivot->read = 1;
}

$authUser->notices()->saveMany($notices);

因此,這將查找該用戶的所有未讀通知,並在它們之間循環,在中間(數據透視)表上設置“ read”屬性。 但是最后一行給出了錯誤

傳遞給Illuminate \\ Database \\ Eloquent \\ Relations \\ BelongsToMany :: saveMany()的參數1必須為數組類型,給定對象

如果手動創建數組,則會出現此錯誤:

完整性約束沖突:1062重復項'4293672207-2904708423'關鍵'notice_user'(SQL:插入notice_user_mapcreated_atnotice_idupdated_atuser_id )值(2016年1月6日17點53分39秒,4293672207,2016-01 -06 17:53:39,2904708423))

我也無法訪問$authUser->notices()->pivot

在數據透視表中批量保存數據的正確方法是什么?

您可以更新它,而不是檢索值然后在它們之間循環。 嘗試這樣的事情:

$user->notices()->wherePivot('read', 0)->update(['read' => 1]);

最終,這應該服從查詢構建器並在單個查詢中更新數據透視表,而不是遍歷並創建多個查詢。

編輯:如果您的數據透視表也有時間戳,那么這將引發錯誤,因為Eloquent不會為這些列名稱添加前綴(不確定原因)。 在那種情況下,您仍然可以使用查詢生成器來實現:

DB::table('notice_user_map')
    ->where('user_id', $user->id)
    ->where('read', 0)
    ->update(['read' => 1]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM