首页 > 解决方案 > 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 语句/过滤器/参数应用于它,如果它们不匹配,则完全忽略该用户。

标签: phplaravellaravel-5eloquent

解决方案


您必须将 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();

推荐阅读