[英]How to query an Eloquent ORM many-to-many relationship
我有在各州(即澳大利亚各州)工作的员工。
员工存储在用户表中。 状态存储在状态表中。 两者之间的多对多关系存储在staff_state中。
在我的 Staff 模型上,我有一个方法如下:
public function workStates()
{
return $this->belongsToMany(Core\State::class);
}
我想检索所有在新南威尔士州工作且名字或姓氏包含字母“dan”的用户。 这是我的雄辩查询:
$query = Staff::whereHas('workStates', function ($query) {
$query->where('state_id', '=', 'NSW');})
->where('first_name', 'like', '%dan%')
->orWhere('last_name', 'like', '%dan%')
->orderBy('first_name', 'asc')
->orderBy('last_name', 'asc');
我的查询结果都包含字母“dan”,但是有些工作人员不在新南威尔士州工作。 我究竟做错了什么?
这是 Eloquent 生成的 SQL 查询:
select * from `users` where (exists
(select * from `states` inner join `staff_state` on `states`.`id` = `staff_state`.`state_id`
where `users`.`id` = `staff_state`.`staff_id` and `state_id` = 'NSW')
and `first_name` like '%dan%' or `last_name` like '%dan%')
and `users`.`deleted_at` is null order by `first_name` asc, `last_name` asc
谢谢..!
我会尝试将first_name
和last_name
条件分组。
我认为您可以通过将闭包传递给where()
函数来做到这一点。 也许是这样的:
Staff::whereHas('workStates', function ($query) {
$query->where('state_id', '=', 'NSW');
})->where(function($query) {
$query
->where('first_name', 'like', '%dan%')
->orWhere('last_name', 'like', '%dan%');
})->orderBy('first_name', 'asc')->orderBy('last_name', 'asc');
您不应使用state_id
,而应使用states
表中的真实列名。 此外, where()
闭包中的组名相关逻辑。 例如,如果列名称是name
:
$state = 'NSW';
$name = 'dan';
Staff::whereHas('workStates', function ($query) use($state) {
$query->where('name', $state);
})
->where(function($query) use($name) {
$query->where('first_name', 'like', '%' . $name . '%')
->orWhere('last_name', 'like', '%' . $name . '%');
})
->orderBy('first_name', 'asc')
->orderBy('last_name', 'asc')
->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.