![](/img/trans.png)
[英]Retrieving a model and updating its (polymorphic) related models in Laravel 7
[英]How to get a model using its related models
我想創建一個點對點聊天,
我有三個模型,ChatMessage,聊天和用戶 model,聊天和用戶 model 有一個多對多的關系,我創建了一個 pivot 表'ychat_user'。
當用戶發起聊天時,它會收到 userId 和接收者的 Id,這里是 function:
public function InitSingleChat(Request $request)
{
$user = auth()->user();
$receiver = User::findOrFail($request->receiver_id);
if ($user) {
if ($receiver) {
$chat = Chat::find([$user -> id, $receiver -> id])->first();
if ($chat) {
return response()->json(['channel' => "private-chat-" . $chat->id, 'chat' => $chat]);
} else {
$chat = new Chat();
$chat -> save();
$chat -> users() -> attach($user);
$chat -> users() -> attach($receiver);
return response()->json(['channel' => "private-chat-" . $chat->id, 'chat' => $chat]);
}
} else {
return response()->json('Receiver not found', 404);
}
} else {
return response()->json('You are not signed in', 401);
}
}
這個想法是首先查找兩個用戶 id 是否有共同的聊天 model,如果沒有,則創建一個新聊天並將兩個用戶附加到一個聊天,並返回聊天 id,否則返回聊天 id。
這個塊$chat = Chat::find([$user -> id, $receiver -> id])->first();
但是總是返回與第一個 userId 相關的所有聊天 id 即 ($user -> id)。
我真正想要的是找到在其集合中具有確切兩個 userId 的聊天,或者如果它不存在則創建一個新的。
我也試過$chat = Chat::whereIn('id', [$user -> id,$receiver -> id])->get()
這就像一個 Or 語句,而需要一個 AND 語句
在偽代碼中,我想要得到的是:
您需要通過關系查詢聊天:
$chat = Chat::whereHas('users', function ($query) use ($user, $receiver) {
return $query->whereIn('id', [$user->id, $receiver->id]);
})->get()->first();
但是,您的數據結構存在一個根本問題。 您無法區分數據庫中的用戶和接收者。 相反,您應該將聊天 ID 傳遞給請求,您可以執行以下簡單操作:
$chat = Chat::find($request->id);
請參閱文檔https://laravel.com/docs/7.x/eloquent-relationships#querying-relationship-existence
在訪問 model 的記錄時,您可能希望根據關系的存在來限制結果。 例如,假設您想要檢索至少有一條評論的所有博客文章。 為此,您可以將關系名稱傳遞給
has
和orHas
方法。
如果您需要更多功能,您可以使用
whereHas
和orWhereHas
方法將“where”條件放在您的has
查詢上。 這些方法允許您將自定義約束添加到關系約束,例如檢查評論的內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.