我有两个表,比如说"users"和"users_actions",其中"users_actions"与用户有一个hasMany关系:
用户
id | name | surname | email...
Run Code Online (Sandbox Code Playgroud)
行动
id | id_action | id_user | log | created_at
Run Code Online (Sandbox Code Playgroud)
Model Users.php
class Users {
public function action()
{
return $this->hasMany('Action', 'user_id')->orderBy('created_at', 'desc');
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想检索列表所有的用户与他们的最后一个动作.
我看到 Users::with('action')->get();
只通过简单地获取关系的第一个结果就可以轻松地给我最后一个动作:
foreach ($users as $user) {
echo $user->action[0]->description;
}
Run Code Online (Sandbox Code Playgroud)
但我当然希望避免这种情况,只为每个用户选择最后一个动作.
我尝试使用约束,比如
Users::with(['action' => function ($query) {
$query->orderBy('created_at', 'desc')
->limit(1);
}])
->get();
Run Code Online (Sandbox Code Playgroud)
但是由于Laravel执行此查询,这给了我一个不正确的结果:
SELECT * FROM users_actions WHERE user_id IN (1,2,3,4,5)
ORDER BY created_at
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
这当然是错的.有没有可能在没有使用Eloquent对每条记录执行查询的情况下获得此功能?我是否犯了一些我没有看到的明显错误?我很擅长使用Eloquent,有时甚至是关系让我烦恼.
编辑: …
使用我们的 User 模型,我们渴望加载对话和这些对话的消息。在每个对话中,我们希望引导最后 25 条消息。所以我们写了下面的查询。
User::where('status', 3)->with(['conversations.messages' => function ($q) {
$q->take(25)->orderBy('created_at', 'DESC');
}])->get();
Run Code Online (Sandbox Code Playgroud)
但是,此函数总共只返回 25 条消息(因此不是每个对话)。即使您有 1000 个用户,它也会加载消息表中的最后 25 条消息,但不会加载用户每个会话的最后 25 条消息。
有没有办法在 Laravel Eloquent 方法中解决这个问题?