У меня есть отношения, в которых я выбираю все строки на основе категории, однако мне нужно исключить некоторые из них, если они находятся в подзапросе.
/** @var \Illuminate\Database\Query\Builder $images */
$images = $vehicle->images()
->whereIn('image_category', $website->image_categories)
->orderBy('seq', 'ASC');
$images->whereNotIn('id', static function ($q) {
return $q->select('id')
->whereIn('image_category', [0, 99])
->groupBy('seq')
->having(DB::raw('count(`seq`)'), '>', 1);
});
dd($images->toSql(), $images->getBindings());
Итак, выше мой код, почти работает так, как я хочу, однако кажется, что переменная $q
не имеет имени таблицы в запросе, ниже выводится запрос:
select
*
from
`vehicle_images`
where
`vehicle_images`.`vehicle_id` = ?
and `vehicle_images`.`vehicle_id` is not null
and `image_category` in (?, ?)
and `id` not in (
select
`id`
where
`image_category` in (?, ?)
group by
`seq`
having
count(`seq`) > ?
)
order by
`seq` asc
Это отношение:
public function images()
{
return $this->hasMany(VehicleImage::class);
}
Вы можете указать, какую таблицу вы хотите использовать.
$images->whereNotIn('id', static function ($q) {
return $q->select('id')->from('{CORRECT_TABLE_NAME_HERE}')
->whereIn('image_category', [0, 99])
->groupBy('seq')
->having(DB::raw('count(`seq`)'), '>', 1);
});
Я не знаю, каким именно должно быть имя таблицы, отсюда и заполнитель.
Я закончил тем, что сделал это, надеялся, что он просто примет его из переданной в ссылке QueryBuilder.