Коллекция коллекции Laravel - PullRequest
0 голосов
/ 18 марта 2019

У меня есть отношение один ко многим в laravel:

  1. типы
  2. продукты - type_id, цена

Как я могу получить $ типов заказа попродукты самая низкая цена?

Пример:

  • type_1 имеет: product_x - 10 €, product_y - 15 €
  • type_2 имеет: product_a - 20 €, product_b - 100€
  • type_3 имеет: product_e - 12 €, product_f - 200 €

, поэтому типы должны быть в порядке: type_1, type_3, type_2.

Я пробовал это:

$types = $types->whereHas('products', function($q) use($order_by_price){
            $q->orderBy('price', $order_by_price);
        });

но не сработало.

Также я попробовал join (), но это как-то испортило коллекцию.Вероятно, из-за одинаковых имен столбцов в таблице типов и продуктов.

Вот вам скриншот

Ответы [ 3 ]

1 голос
/ 18 марта 2019

Поскольку у вас есть отношения один ко многим, вам нужно будет объединиться. Мне проще пойти по другому пути, то есть сгруппировать все товары по их типу и заказу по минимальной цене.

 $types = Product::with('type')->groupBy('type_id')
         ->select('type_id', \DB::raw('MIN(price) as minPrice'))
         ->orderBy('minPrice')
         ->get()
         ->pluck('type');

Предполагается, что у вас есть отношение типа, определенное в продукте с именем «тип».

1 голос
/ 18 марта 2019

Просто сделайте

$type->products()->orderBy('price')->get();

или

Product::orderBy('price')->get();

Если вы хотите получить более подробный ответ, пожалуйста, поделитесь большим количеством кода (модели, контроллеры и т. Д.), Чтобы я знал, как использовать различныемодели / решение

0 голосов
/ 18 марта 2019

Прежде всего, вы собираете все свои фильтры и применяете их все вместе.Вы можете сделать что-то вроде следующего.

$min_price = request('min_price');
$max_price = request('max_price');
$order_by_price = request('order_by_price');

$types = Type::whereIn('category_id', $type_categories)->whereHas('products', function ($q) use ($min_price, $max_price, $order_by_price) {
    if (!is_null($min_price)) {
        $q->where('price', '>=', $min_price);
    }

    if (!is_null($max_price)) {
        $q->where('price', '<=', max_price);
    }

    if (!is_null($order_by_price)) {
        $q->orderBy('price', $order_by_price);
    }
})->paginate(9);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...