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
我需要能够将 2 个表连接在一起,但只能通过 获取最新的状态列date
,如下所示
ID | FIRSTNAME | EMAIL_ADDRESS | STATUS_ID | STATUS | DATE
1 | Joe Bloggs | Joe@bloggs.com | 1 | 'In' | 2018-06-04 09:01:00
我需要能够运行额外的查询构建器参数,例如where
,因为用户能够在需要时传入过滤器和搜索参数,所以为了能够在我的查询构建器中使用状态表列,我正在做像这样加入
$users = Users::join('status', 'status.user_id', '=', 'user.id')->distinct('user.id');
然后允许我在需要时传递任何搜索参数
if(!empty($request->search)){
$param = $request->search;
$users = $users->where(function($query) use ($param){
$query->where('users.firstname', 'like', '%'.$param.'%')
->orWhere('users.email_address', 'like', '%'.$param.'%');
});
}
if(!empty($request->dateFrom)){
if(!empty($request->dateTo)){
$users = $users->whereRaw('DATE(status.date) BETWEEN ? AND ?', [$request->dateFrom, $request->dateTo]);
} else {
$users = $users->whereRaw('DATE(status.date) BETWEEN ? AND DATE(NOW())', [$request->dateFrom]);
}
}
get()
然后在最后运行 my
if($method == 'paginate'){
$users = $users->paginate(10);
} else {
$users = $users->get();
}
这将返回以下内容
ID | FIRSTNAME | EMAIL_ADDRESS | STATUS_ID | STATUS | DATE
1 | Joe Bloggs | Joe@bloggs.com | 1 | 'In' | 2018-06-04 09:01:00
2 | Joe Bloggs | Joe@bloggs.com | 1 | 'Out' | 2018-06-04 09:00:00
我需要能够在我的Where
函数中使用外部表列作为参数,但我只需要为每个用户返回 1 行。如何运行联接,但只为每个用户返回 1 行?
解决方案
要获取每个用户的最新记录,您可以对状态表使用自联接
select u.*,s.*
from user u
join status s on u.id = s.user_id
left join status s1 on s.user_id = s1.user_id
and s.date < s1.date
where s1.user_id is null
使用查询生成器,您可以将其重写为
DB::table('user as u')
->select('u.*', 's.*')
->join('status as s', 'u.id ', '=', 's.user_id')
->leftJoin('status as s1', function ($join) {
$join->on('s.user_id', '=', 's1.user_id')
->whereRaw(DB::raw('s.date < s1.date'));
})
->whereNull('s1.user_id')
->get();
推荐阅读
- ios - 如何在 Swift 中完成 performSegue 后执行操作
- php - Laravel 比较模型日期列和关系日期列
- swiftui - TextField 错误:闭包中对属性“$ ...”的引用需要明确的“self”。使捕获语义明确
- angular - Nativescript Angular 中的 @HostListener('tap')
- node.js - 如何使用节点 js 将图像放入 mongodb
- android - 如何使用带有 ChainStyle 的 ConstraintSet 在 ConstraintLayout 内对称地翻转小部件?
- python - M2M 字段小部件可将数据添加或更新为内联表单集
- html - InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'System.Int32'
- nginx - Nginx geoip重定向
- ios - 如何在 Objective-C 中的变量中放置一个块(闭包)?