繁体   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