Laravel 5.7-雄辩的查询,检查是否不等于id或null,是否不等于另一个id和团队id不在(?,)
我试图在我的模型上创建一个作用域,根据以下可能性查询与用户无关的结果: 1.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(
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);