[英]Laravel 4 - How to get the latest in with() for each record in one query
我正在laravel 4中使用消息傳遞系統。我有下表表格表user,conversation,conversation_user(pivot)和消息。 用戶和對話具有多對多關系,對話有許多消息,而用戶有許多消息。 我得到了這樣的用戶對話:
$usersConversations = Auth::user()->conversations;
然后,我遍歷它們以獲取其ID,以便僅選擇那些消息用戶和消息,如下所示:
if(0 < $usersConversations->count()) {
foreach ($usersConversations as $conversation) {
$conversationIds[] = $conversation->id;
}
$conversations = Conversation::with('users', 'messages')->whereIn('id', $conversationIds)->get();
} else {
$conversations = false;
}
但這會返回所有用戶和每個對話的所有消息。 我不需要所有用戶,但每次對話只需要最新消息。 所以我嘗試這樣做:
$conversations = Conversation::with('users', 'latestMessage')->whereIn('id', $conversationIds)->get();
// and have this in my Conversation model
public function latestMessage() {
return $this->hasMany('Message')->orderBy('created_at', 'desc')->take(1);
}
這確實給了我最新的消息,但無論有多少次奉獻,都只有最新的消息,只有一個。 我不會在每次對話中都留言。
誰能幫助我構造該查詢? 提前致謝。
這是您要找的東西。
$conversations = Conversation::with(array('users', 'messages' => function($query){
$query->orderBy('created_at', 'desc')
->take(1);
})->get();
無需使用latestMessage
函數。
編輯 :如果關系不是1-1,則返回的項目將是一個集合。 即使您使用first()
代替take(1)
。 老實說,我認為這不是故意的,但要解決此問題,請確保將您的消息輸出為:
foreach($conversations as $conversation){
echo $conversation->messages->first()->YOUR_FIELD;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.