Laravel 5.7 - Eloquent Query, который проверяет, не равен ли id или null И не равен ли другому id и team_id не в (?,?)

Я пытаюсь создать область в своей модели, которая запрашивает результаты, не связанные с пользователем, на основе следующих возможностей: 1. assigned_user_id не равно нулю, а reported_by не совпадает, и любой из team_id пользователя (один к -множество пользователей к командам) соответствуют assigned_team_id И 2. assigned_user_id не соответствует, а reported_by не соответствует, и любой из team_id пользователя (один ко многим от пользователя к командам) соответствует assigned_team_id

Единственная сложная часть для меня на самом деле заключается в том, что заданный_user_id может принимать значение NULL. Требуется параметр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_id. Версия псевдокода будет 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.


person Matt Larson    schedule 19.10.2018    source источник


Ответы (1)


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);
person Devon    schedule 19.10.2018