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