Laravel Eloquent - сортировка родителя по атрибуту дочерних отношений - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть Product, который имеет несколько Variants.

. Я хочу выбрать все продукты и отсортировать их по цене первого базового варианта потомка.

Продукт A

  • Вариант A1 (цена: $ 3)
  • Вариант A2 (цена: $ 3)

Продукт B

  • Вариант B1 (цена: $ 2)
  • Вариант B2 (цена: $ 2)

Продукт C

  • Вариант C1 (цена: 4 $)
  • Вариант C2 (цена: $ 4)

В этом случае, если я хочу заказать по цене asc, я ожидаючтобы получить следующий результат заказа:

  • Продукт B
  • Продукт A
  • Продукт C

Мой текущий (не работающий) запрос:

Product::with(['variants' => function ($q) {
   $q->orderBy('price', 'desc');
}])->orderBy('variants.price', 'desc')->get();

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Вы можете заказать их после получения.

$products = Product::with('variants')
    ->get()
    ->sortBy(function($product) {
        // if you want to order by first found
        return $product->variants->first()->price;

        // if you want to order by max price
        return $product->variants->max->price;

        // or min price
        return $product->variants->min->price;

        // or average price
        return $product->variants->average->price;
    });
0 голосов
/ 30 сентября 2019

Решено с помощью следующего запроса:

Product::join('variants', function ($join) {
   $join->on('variants.product_id', '=', 'products.id');
})
   ->select('products.*', DB::raw("MAX(variants.price) as max_variant_price"))
   ->groupBy('variants.product_id')
   ->orderBy('max_variant_price')
   ->get();


0 голосов
/ 30 сентября 2019

1-й: вы не можете заказать с помощью with:

Потому что с сделает отдельный запрос, как это:

SELECT * FROM users;
SELECT * FROM roles WHERE id IN (1, 2, 3, 4, whatever...);

2-й: Решение для вашей проблемы является использование join заявление, чтобы сделать только 1 запрос:

Например:

$order = 'desc';
$products = Product::join('variants', 'variants.product_id', '=', 'products.id')->orderBy('products. price', $order)->select('products.*')->paginate(10);

Надеюсь, это полезно для вас, спасибо

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