【发布时间】: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)
我的用户模型有id 和generalist 列。
我的事件模型有 id、user_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