Laravel 5.7-雄辩的查询,检查是否不等于id或null,是否不等于另一个id和团队id不在(?,)

Laravel 5.7-雄辩的查询,检查是否不等于id或null,是否不等于另一个id和团队id不在(?,),laravel,laravel-5,orm,eloquent,laravel-5.7,Laravel,Laravel 5,Orm,Eloquent,Laravel 5.7,我试图在我的模型上创建一个作用域,根据以下可能性查询与用户无关的结果: 1.assigned_user_id不为空,并且由报告的不匹配,并且任何用户的团队id(一对多用户对团队)与assigned_团队id 及 2.分配的用户id不匹配,并且报告的不匹配,并且任何用户的团队id(一对多用户对团队)与分配的团队id匹配 对我来说,唯一棘手的部分是分配的用户id是可空的。指定的团队id是必需的,报告人是必需的。这是我目前的尝试: public function scopeNotRelativeTo(

我试图在我的模型上创建一个作用域,根据以下可能性查询与用户无关的结果: 1.
assigned_user_id
不为空,并且由报告的
不匹配,并且任何用户的团队id(一对多用户对团队)与
assigned_团队id
及 2.
分配的用户id
不匹配,并且
报告的
不匹配,并且任何用户的团队id(一对多用户对团队)与
分配的团队id匹配

对我来说,唯一棘手的部分是分配的用户id是可空的。指定的团队id是必需的,报告人是必需的。这是我目前的尝试:

public function scopeNotRelativeTo($query, User $user)
{
    $teamIDs = $user->teams->pluck('id');

    $query->whereNull('assigned_user_id')
          ->orWhere('assigned_user_id', '!=', $user->id)
          ->where('reported_by', '!=', $user->id)
          ->whereNotIn('assigned_team_id', $teamIDs);
}
这将返回46个结果,我预计是41个,所以这并不完全正确。
toSql()

"select * from \"bugs\" where (\"assigned_user_id\" is null or \"assigned_user_id\" != ? and \"reported_by\" != ? and \"assigned_team_id\" not in (?, ?)) and \"bugs\".\"deleted_at\" is null order by \"created_at\" desc"

这看起来很接近,但显然仍然不完美。我可以肯定地看到,在大多数情况下,与团队ID匹配的结果都会从裂缝中溜走。伪代码版本将是
如果分配的用户id不为null,并且报告的用户id与分配的团队id不匹配,则返回结果。分配的团队id不在用户->团队id中,或者分配的用户id与用户id不匹配,报告的用户id与用户id不匹配,并且分配的团队id不在用户->团队id中,SQL和大多数编程语言都是分开的
上的条件

也就是说,在您的查询和伪代码中,您实际上是在问:

where the assigned_user_id is null 
OR
where assigned_user_id = ? AND reported_by doesn't match ? AND assigned_team_id not in (?, ?)
您可能希望在逻辑上包含OR条件,这是通过SQL中的括号或Elount中的嵌套闭包实现的:

$query->where(function($q) {
           $q->whereNull('assigned_user_id')
             ->orWhere('assigned_user_id', '!=', $user->id);
      })
      ->where('reported_by', '!=', $user->id)
      ->whereNotIn('assigned_team_id', $teamIDs);

SQL和大多数编程语言在
上拆分条件

也就是说,在您的查询和伪代码中,您实际上是在问:

where the assigned_user_id is null 
OR
where assigned_user_id = ? AND reported_by doesn't match ? AND assigned_team_id not in (?, ?)
您可能希望在逻辑上包含OR条件,这是通过SQL中的括号或Elount中的嵌套闭包实现的:

$query->where(function($q) {
           $q->whereNull('assigned_user_id')
             ->orWhere('assigned_user_id', '!=', $user->id);
      })
      ->where('reported_by', '!=', $user->id)
      ->whereNotIn('assigned_team_id', $teamIDs);