Laravel 5.7 - Eloquent 检查是否不等于 id 或 null 且不等于另一个 id 和 team_id 不在 (?, ?) 中的查询

Laravel 5.7 - Eloquent Query that checks if not equal to id or null AND not equal to another id and a team_id not in (?, ?)

我正在尝试在我的模型上创建一个范围,该范围根据以下可能性查询与用户无关的结果: 1. assigned_user_id 不为空且 reported_by 不匹配且任何用户的 team_ids(一对多用户到团队)与 assigned_team_id 匹配 和 2. assigned_user_id 不匹配且 reported_by 不匹配且任何用户的 team_ids(一对多用户到团队)匹配 assigned_team_id

对我来说唯一棘手的部分是 assigned_user_id 可以为空。 assigned_team_id 是必需的,reported_by 是必需的。这是我目前的尝试:

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"

看起来很接近,但显然仍然不完美。我可以肯定地看到,大多数情况下,匹配 team_ids 的结果会从裂缝中溜走。伪代码版本为 Give me results where the assigned_user_id is not null AND reported_by doesn't match userId AND assigned_team_id not in user->teamIds OR assigned_user_id doesn't match userId AND reported_by doesn't match userId and assigned_team_id is not in user->teamIds.

SQL 和大多数编程语言在 OR.

上拆分条件

意思是,在您的查询和伪代码中,您实际上是在问:

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 中的括号或 Eloquent 中的嵌套闭包完成的:

$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);