【问题标题】:Laravel eloquent query when filtering过滤时的 Laravel 雄辩查询
【发布时间】:2018-11-18 18:57:38
【问题描述】:

我目前正在处理这个查询

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 列中,所以我需要获取所有通才 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); 运行时,过滤器可以正常工作。

我真的不明白为什么不起作用,如果您需要更多信息,请告诉我

【问题讨论】:

  • 请问您为什么在关系中使用$this->hasOne() 而不是$this->belongsTo()?仅从上下文来看,如果您在 User 模型上定义 public function incidents() { $this->hasMany('App\Incident', 'incident_id', 'id'); } 对我来说是有意义的,因为通常用户可以有多个事件...但是当使用 hasMany() 时,您需要 belongsTo() 在另一个结束。
  • 我真的不能说,因为我没有做那部分,但为什么在某些情况下工作
  • 可能是因为您以错误的方式混合了->where()orWhere()
  • @PaulSpiegel 你的意思是$query->whereIn('from_id',User::select('id')->where('generalist',$uid)->get()) ->orWhere('user_id',$uid);
  • 是的。您可能需要将其包装到 ->where(function($q) {...}) 中以便为条件添加双亲。

标签: php mysql laravel eloquent


【解决方案1】:

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;

【讨论】:

    【解决方案2】:

    对不起,如果我没有很好地解释自己,我解决了这个问题,在外面添加了另一个 where 函数

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-26
      • 2021-07-23
      • 2020-03-24
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多