繁体   English   中英

如何查询 Eloquent ORM 多对多关系

[英]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_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');

您不应使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM