Laravel - как сгруппировать данные по ключу и сохранить в массив? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть таблица attribute_values ​​(id, value, attr_group_id).
Мне нужно вернуть коллекцию, сгруппированную по ключу attr_group_id.

в чистом php с использованием ORM RedBean я сделал:

$data = \DB::table('attribute_values')->get();
$attrs = [];
foreach ($data as $k => $v){
    $attrs [$v['attr_group_id']][$k] = $v['value'];
   }
return $attrs;

Мне нужно то же самое, используя Laravel, после этого:

  $data = \DB::table('attribute_values')->get();

Моя таблица

  id    value     attr_group_id
   1     one          1
   2     two          1
   3     three        2
   4     four         2
   5     five         3
   6     six          3

И мне нужен результат

   Array(
[1] => Array 
    (
    [1] => one
    [2] => two
    )
[2] => Array 
    (
    [3] => three
    [4] => four
    )
[3] => Array 
    (
    [5] => five
    [6] => six
    )
  )

Ответы [ 5 ]

2 голосов
/ 13 июня 2019

Делать все это в raw SQL будет более эффективно, база данных SQL достаточно хороша для этих операций. SQL имеет группирование по функциям, так как вы перезаписываете значение, я просто получаю его с помощью max() (это странно, что вы перезаписываете значение, вы на самом деле просто хотите уникальные результаты?).

DB::table('attribute_values')
    ->select('attr_group_id', DB::raw('max(value)'))
    ->groupBy('attr_group_id')
    ->get();

EDIT Поскольку область действия изменилась, вы можете использовать методы коллекции Laravels, то есть операции с коллекцией.

DB::table('attribute_values')
    ->get()
    ->groupBy('attr_group_id')
    ->toArray();
2 голосов
/ 13 июня 2019

Получить все данные и отобразить их с идентификатором атрибута каждой строки будет работать,

$data = \DB::table('attribute_values')->get();
$attrs = [];
foreach ($data as $key => $value) {
    // -> as it return std object
    $attrs[$value->attr_group_id][] = $value->value;
}
dd($attrs);
1 голос
/ 13 июня 2019

Вы можете использовать функцию groupBy () сбора как:

$data = \DB::table('attribute_values')->get()->groupBy('attr_group_id');

Объединяет записи с тем же attr_group_id под значением этого поля, что и при создании ключа коллекции.

0 голосов
/ 13 июня 2019

Друзья, это готовое задание, которое мне нужно!Я сделал это сам, а ты мне помог.Если кто-то заинтересованный может прочитать.

Я объясню вам, почему мне нужен именно этот метод.Я делаю интернет-магазин с часами, и теперь была задача сделать фильтры и атрибуты для фильтров.Таким образом, есть три таблицы

attribute_groups table

enter image description here

attribute_products table

enter image description here

attribute_values

enter image description here

Мне нужно отобразить виджет Laravel на моем .blade.php как

{{ Widget::run('filter', 'tpl' => 'widgets.filter', 'filter' => null,]) }} 

Когда я создаю новый продукт в панели администратора.Я должен сохранить идентификатор продукта и attribute_id в attribute_products, но для одного продукта может быть как можно больше атрибутов.Итак, если я воспользуюсь этой опцией

$data = \DB::table('attribute_values')
            ->get()
            ->groupBy('attr_group_id')
            ->toArray(); 

Я получил результат:

enter image description here

Но!каждый новый массив начинается с индекса 0. Но мне нужен индекс, который означает его идентификатор.attr_group_id из таблицы attribute_value для сохранения в attribute_products.И после того, как я вижу только один метод для меня.

$data = \DB::table('attribute_values')->get();
        $attrs = [];
        foreach ($data as $key => $value) {
            $attrs[$value->attr_group_id][$value->id] = $value->value;
        }

        return $attrs;

и результат, который я искал

enter image description here

теперь вы можетепосмотри какая разница и что было нужно.Индекс массива начинается с 1,2,3,4,5, и этот индекс = attr_group_id.К сожалению, я не смог изначально задать правильный вопрос.спасибо всем.

0 голосов
/ 13 июня 2019

Laravel Version 5.8

Таким образом, вам нужно сгруппировать идентификатор, если вам нужно в модели, как я создал модель как AttributeValue

$modelWay = \App\AttributeValue::get()
            ->groupBy('attr_group_id');

если вам нужно в DBWay, я создал таблицу как attribute_values ​​

$dbWay = \DB::table('attribute_values')
        ->get()
        ->groupBy('attr_group_id');

Оба будут давать одинаковый результат

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