[英]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_map
(created_at
,notice_id
,updated_at
,user_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.