php - Laravel 过滤器基于有一个关系
问题描述
我把我的头发拉到这个上面,我觉得我已经尝试了每一种方法!
这是我的问题。
我有 2 张桌子
用户
ID | FIRSTNAME | EMAIL_ADDRESS
1 | Joe Bloggs | joe@bloggs.com
地位
ID | USER_ID | STATUS | DATE
1 | 1 | 'In' | 2018-06-04 09:01:00
2 | 1 | 'Out' | 2018-06-04 09:00:00
从上表可以看出,每个用户可以有很多状态,但每个用户必须有 1 个最近的状态,我正在这样做(如果我做错了请告诉我)
public function statusCurrent(){
return $this->hasOne('App\Status', 'user_id', 'id')->orderBy('date', 'desc')->limit(1);
}
然后我在我的视图中打开了一个表单,它通过一个$request
.
我需要能够使用过滤器,并将它们应用于 1 最近的状态。例如,如果有人搜索 date2018-06-04 09:00:00
和 user id 1
,我需要它显示 NO RESULTS,因为该用户的 1 个最新记录与该日期不匹配,但目前,它只会跳过最如果不匹配,则为最近的,并获取下一个匹配的记录。
我已经尝试过似乎每种方法,我已经尝试过这样
$users = Users::with(['StatusCurrent' => function($query){
$query->where('status.status', 'In');
}])->get();
哪个获得正确的最新行,但是如果我尝试status.status, 'out'
改为,它只是跳过并获得状态为 out 的记录号 2。
我也试过这样
$users = Users::has('StatusCurrent')->paginate(10);
if(!empty($request->statusIn)){
$users = $users->filter(function ($item){
$item = $item->statusCurrent->status == 'in';
return $item;
});
}
return $users;
效果很好,但是在尝试GET
为过滤器附加任何参数时分页会中断。
纯英语
我需要能够获得用户的最新状态,然后一旦我拥有它,我需要能够将 where 语句/过滤器/参数应用于它,如果它们不匹配,则完全忽略该用户。
解决方案
您必须将 JOIN 与子查询结合起来:
$users = User::select('users.*')
->join('status', 'users.id', 'status.user_id')
->where('status.status', 'in')
->where('status.id', function($query) {
$query->select('id')
->from('status')
->whereColumn('user_id', 'users.id')
->orderByDesc('date')
->limit(1);
})
->get();
推荐阅读
- java - 订单按钮未绑定到 Firebase
- c++ - 在多线程代码中实现安全恢复的断点
- c# - 将 IdentityUser 关联到 EF Core 中的实体
- html - 为什么 nth-child 选择器在 css 中不起作用?
- linux - 为什么 React Native 会挂在 59% 上?
- c# - 等效于 C# 中的 C++“this”指针
- java - java合并两个List
- android - Android - 仅启用 URL 链接,但在触及 TextView 中的非 URL 链接时禁用其他链接
- bash - How to write String to a text File
- python - 使用索引列表对numpy数组的元素执行操作