Я пытаюсь создать область в моей модели, которая запрашивает результаты, не относящиеся к пользователю, основываясь на следующих возможностях: 1. assigned_user_id
не равен нулю и reported_by
не совпадает, и любой изteam_ids пользователя (один-ко-многим пользователям в команды) совпадают с assigned_team_id
AND 2. assigned_user_id
не совпадает и reported_by
не совпадает, и любой из team_ids пользователя (один-ко-многим пользователюкоманды) соответствует assigned_team_id
Единственная сложность для меня на самом деле заключается в том, что значение assign_user_id может быть нулевым.assign_team_id является обязательным, а report_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
.