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);
我正在尝试在我的模型上创建一个范围,该范围根据以下可能性查询与用户无关的结果:
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);