我有在美国工作的员工(即澳大利亚各州)。
员工存储在users表中。状态存储在状态表中。两者之间的多对多关系存储在staff_state中。
在我的员工模型上,我有一个方法如下:
$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查询:
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
我的查询结果全部包括字母' dan'但是一些工作人员在新南威尔士州不工作。我做错了什么?
这是Eloquent生成的SQL查询:
{{1}}
谢谢..!
答案 0 :(得分:1)
我会尝试对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');
答案 1 :(得分:0)
您不应使用state_id
,请使用states
表中的实际列名称。
此外,where()
closure内的组名相关逻辑。例如,如果列名称为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();