HasMany самый высокий / самый низкий в вычисляемом поле - PullRequest
0 голосов
/ 24 января 2020

На моем сайте я показываю предложения продуктов.

Продукт имеет много предложений. Предложение имеет много продаж. Предложение принадлежит Разметке.

Предложение "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 и добавления его к выбору. Но таким образом я не могу проверить это предложение не полностью продано.

Как решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...