如何查询Eloquent ORM多对多关系

时间:2018-02-08 04:37:32

标签: mysql sql laravel eloquent

我有在美国工作的员工(即澳大利亚各州)。

员工存储在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}}

谢谢..!

2 个答案:

答案 0 :(得分:1)

我会尝试对first_namelast_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();