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