Laravel 5.7 - Eloquent Query, который проверяет, не равен ли id или null И не равен ли другой id, а team_id не в (?,?) - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать область в моей модели, которая запрашивает результаты, не относящиеся к пользователю, основываясь на следующих возможностях: 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.

1 Ответ

0 голосов
/ 19 октября 2018

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 (?, ?)

Что вы, вероятно, хотите, чтобылогически содержать условие ИЛИ, которое выполняется в круглых скобках в 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);
...