У меня есть следующий код, который возвращает все файлы, связанные с тегом из массива $ includes, который работает нормально.
FileObject::whereHas('tags', function($q) use ($included){
$q->WhereIn('name', $included);
})->get())
Теперь я хочу исключить некоторые теги, поэтому я попробовал этот код ниже, который, кажется, не работает.
FileObject::whereHas('tags', function($q) use ($included,$excluded){
$q->WhereIn('name', $included)
->WhereNotIn('name', $excluded);
})->get())
Как мне создать этот запрос?
Благодарю.
Редактировать 1
Возвращенная подготовленная строка SQL выглядит следующим образом
select * from `fileobjects`
where exists (
select * from `tags`
inner join `taggables` on `tags`.`id` = `taggables`.`tag_id`
where `taggables`.`taggable_id` = `fileobjects`.`id`
and `taggables`.`taggable_type` = ?
and `name` in (?) and `name` not in (?)
)
Но мне нужно это
select * from `fileobjects`
where
(
exists (
select * from `tags`
inner join `taggables` on `tags`.`id` = `taggables`.`tag_id`
where `taggables`.`taggable_id` = `fileobjects`.`id`
and `taggables`.`taggable_type` = "App\\FileObject"and `name` in (?)
)
)
and
(
not exists (
select * from `tags`
inner join `taggables` on `tags`.`id` = `taggables`.`tag_id`
where `taggables`.`taggable_id` = `fileobjects`.`id`
and `taggables`.`taggable_type` = "App\\FileObject"and `name` in (?)
)
)
решаемая
Ну, в моем случае это работает как ожидалось
$files = FileObject::whereHas('tags', function($q) use ($included){
$q->whereIn('name', $included);
})->whereDoesntHave('tags', function($q) use ($excluded){
$q->whereIn('name', $excluded);
})->get();
Задача ещё не решена.
Других решений пока нет …