过滤时Laravel雄辩查询

时间:2018-06-08 16:55:52

标签: php mysql laravel eloquent

我目前正在处理此查询

select * 
  from incidents 
 where from_id in (SELECT id FROM users WHERE generalist = 579) 
    or user_id = 579 
 order 
    by(created_at)

我的用户模型有idgeneralist列。 我的事件的模型有iduser_id这是老板ID,from_id是员工ID

我的想法是generalist可以看到事件,但它们可能不在user_id列中,所以我需要让所有通配符匹配的用户

我尝试在Eloquent上制作它并最终得到这个// $ uid是用户的id

$query->whereIn('from_id',User::select('id')->where('generalist',$uid)->get())
            ->orWhere('user_id',$uid);

我得到了我想要的东西,但是后来我有一个输入,所以我可以过滤信息//通过$ search var

$query->where(function($tq) use ($search){
                    $tq->whereHas('from',function($query2) use ($search){
                        $query2->where('firstname', 'like', "%$search%")
                              ->orWhere('lastname', 'like', "%$search%")
                              ->orWhere('number', 'like', "%$search%");
                    })
                    ->orWhere('status', 'like', "%$search%");
                });

这是模型中的“from”函数

public function from() {
    return $this->hasOne('App\User','id','from_id');
}

我的问题是过滤没有,但是当$query->where('user_id', $uid);正在运行时,过滤器工作正常。

我真的不知道为什么不工作,如果你需要更多信息请告诉我

2 个答案:

答案 0 :(得分:0)

FWIW,我发现这更容易阅读...

SELECT i.* 
  FROM incidents i
  JOIN users u
    ON u.id = i.from_id
 WHERE u.generalist = 579 
    OR i.user_id = 579 
 ORDER 
    BY i.created_at;

答案 1 :(得分:0)

很抱歉,如果我没有很好地解释自己,我解决了将其添加到另外一个功能

的情况下
          $query->where(function($tq) use ($uid){
                $tq->WhereHas('general',function ($query3) use ($uid){
                    $query3->where('generalist','=',$uid);
                })->orWhere('user_id', $uid);
            });