На моем сайте я показываю предложения продуктов.
Продукт имеет много предложений. Предложение имеет много продаж. Предложение принадлежит Разметке.
Предложение "final_price" рассчитывается как "offer.price * markups.amount".
Предложение "available_quantity" рассчитывается как "offer.quantity - сумма (sales.quantity).
Таблицы:
продукты:
id
1
2
3
4
наценки :
id | amount
1 | 1
2 | 2
предложения:
id | product_id | quantity | price | markup_id
1 | 1 | 15 | 1 | 1 (available_quantity = 0, final_price = 1)
2 | 2 | 10 | 0 | 2 (available_quantity = 10, final_price = 0)
3 | 1 | 5 | 1 | 1 (available_quantity = 3, final_price = 1)
4 | 3 | 6 | 2 | 2 (available_quantity = 4, final_price = 4)
5 | 2 | 2 | 3 | 1 (available_quantity = 2, final_price = 3)
6 | 2 | 1 | 1 | 1 (available_quantity = 1, final_price = 1)
продажи:
id | offer_id | quantity
1 | 1 | 10
2 | 1 | 5
3 | 3 | 2
4 | 4 | 2
Мне нужно показать все продукты (разбитые на страницы), которые имеют предложения, которые не были полностью проданы, и final_price> 0 отсортировано по available_quantity или final_price.
При сортировке по available_quantity des c результат должен быть:
id
3 (available_quantity = 4, final_price = 4)
1 (available_quantity = 3, final_price = 1)
2 (available_quantity = 2, final_price = 3)
При сортировке по final_price des c результат должен быть:
id
3 (available_quantity = 4, final_price = 4)
2 (available_quantity = 2, final_price = 3)
1 (available_quantity = 3, final_price = 1)
Я пытался (при заказе по окончательной цене):
Product::addSelect([
'final_price' => Offer::withFinalPrice()
->orderBy('final_price', 'desc')
->whereColumn('product_id', 'products.id')
->limit(1)
])
->orderBy('final_price', 'desc')
->has('offers')
->having('final_price', '>', 0)
->paginate(3);
Область действия withFinalPrice () объединяет таблицу наценок для вычисления final_price и добавления его к выбору. Но таким образом я не могу проверить это предложение не полностью продано.
Как решить эту проблему?