簡體   English   中英

Laravel 4-如何在一個查詢中獲取每條記錄的最新with()

[英]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.

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