Сортировка товаров по наличии связей
Есть список товаров в которых есть связь с таблицей акций
public function promo()
{
return $this->hasOne(PromoProduct::class);
}
Необходимо сделать выборку в которой вначале выведутся товары с акцией , а потом те у которых нет акции
public function scopePromo($builder)
{
return $builder->where(function ($query) {
$query->has('promo');
})->orWhere(function ($query) {
$query->doesnthave('promo');
});
}
Как правильно отсортировать товары?
Ответы (3 шт):
Автор решения: Dmitrii Sedov
→ Ссылка
Попробуйте так. Пример:
$result_arr = \App\Product::withCount('promo')->get()->sortByDesc('promo_count')->toArray();
В результате первыми в списке будут те продукты у которых есть промо. Так же в результирующий массив добавится колонка promo_count
Автор решения: Eugene
→ Ссылка
public function scopePromo($builder)
{
return $builder->orderBy('promo', 'desc');
}
Все записи с NULL уйдут в конец.
Автор решения: Евгений Е
→ Ссылка
Вот так сделал.
$queryBuilder->leftJoin('promos', function (JoinClause $join) {
$join->on('products.id', '=', 'promos.product_id')
->whereExists(function (\Illuminate\Database\Query\Builder $query) {
$query->orderBy('promos.position');
});
});