我正在開發一個Laravel聊天應用程式,我有一個問題,每條訊息都收到兩次(重復)
這是我的代碼:
return Chat::join('users', function ($join) {
$join->on('chats.from_id', '=', 'users.id')
->orOn('chats.to_id', '=', 'users.id');
})->where(function ($q) {
$q->where('chats.from_id', Auth::id())->orWhere('chats.to_id', Auth::id());
})
->orderBy('chats.created_at', 'desc')->select('users.id as user_id', 'chats.id as chat_id', 'message')->get();
uj5u.com熱心網友回復:
這是因為您要加入chats并參加users兩次會議。一次from_id又一次,to_id所以它會導致重復的結果。要修復它,您可以通過 php 代碼或 mysql 查詢獲得唯一的行或聯合兩個單獨的查詢。
uj5u.com熱心網友回復:
正如@mohammad-mirsafaei 在他的回答中所說:
這是因為您要加入
chats并參加users兩次會議。
- 要解決此問題:
代替...
->orOn('chats.to_id', '=', 'users.id');
用這個...
->orWhere('chats.to_id', '=', 'users.id');
- 更完整的答案是:
2a)。將這兩種“關系”方法添加到您的Chat.php模型中。
// ...
public function from() {
return $this->belongsTo(User::class, "from_id");
}
public function to() {
return $this->belongsTo(User::class, "to_id");
}
// ...
2b)。將負責執行查詢的方法添加到Chat.php模型中。
// ...
public static function chats() {
return Chat::join('users', function ($join) {
$join->on('chats.from_id', '=', 'users.id')
->orWhere('chats.to_id', '=', 'users.id');
})->where(function ($q) {
$q->where('chats.from_id', Auth::id())->orWhere('chats.to_id', Auth::id());
})
->with(["from" => function($query) {
return $query->select(["id", "name"]);
}])
->with(["to" => function($query) {
return $query->select(["id", "name"]);
}])
->orderBy('chats.created_at', 'desc')->select('from_id', 'to_id', 'chats.id as chat_id', 'message')->get();
}
// ...
樣本輸出:
Ivan@DESKTOP-LQIK691 MINGW64 /c/xampp/htdocs/breezep (master)
$ php artisan tinker
Psy Shell v0.10.6 (PHP 8.0.2 — cli) by Justin Hileman
>>> App\Models\Chat::chats()
=> Illuminate\Database\Eloquent\Collection {#4387
all: [
App\Models\Chat {#4381
from_id: 2,
to_id: 3,
chat_id: 5,
message: "No, I didn't!",
from: App\Models\User {#4388
id: 2,
name: "stevenmwesigwa",
},
to: App\Models\User {#4393
id: 3,
name: "john ripper",
},
},
App\Models\Chat {#4382
from_id: 3,
to_id: 2,
chat_id: 4,
message: "The day went well. Did you go to the supermarket today?",
from: App\Models\User {#4390
id: 3,
name: "john ripper",
},
to: App\Models\User {#4391
id: 2,
name: "stevenmwesigwa",
},
},
App\Models\Chat {#4383
from_id: 3,
to_id: 2,
chat_id: 3,
message: "I'm fine how're you?",
from: App\Models\User {#4390},
to: App\Models\User {#4391},
},
App\Models\Chat {#4384
from_id: 2,
to_id: 3,
chat_id: 2,
message: "How was your day?",
from: App\Models\User {#4388},
to: App\Models\User {#4393},
},
App\Models\Chat {#4385
from_id: 2,
to_id: 3,
chat_id: 1,
message: "Hello Johny",
from: App\Models\User {#4388},
to: App\Models\User {#4393},
},
],
}
>>>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408107.html
標籤:
