Php Laravel-如何按键分组数据并保存到阵列?

Php Laravel-如何按键分组数据并保存到阵列?,php,laravel,Php,Laravel,我有表属性值(id、值、属性组id)。 我需要返回按键attr\u group\u id分组的集合 在clear 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; 我需

我有表属性值(id、值、属性组id)。
我需要返回按键attr\u group\u id分组的集合

在clear 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
    )
  )

获取所有数据,并将其映射到每行的属性id即可

$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);

在原始
SQL
中执行所有这些操作将更加高效,
SQL
数据库非常擅长这些操作
SQL
有一个groupby函数,因为您正在覆盖值,所以我只需要使用
max()
(这看起来很奇怪,您覆盖了值,您真的只需要唯一的结果吗?)

编辑 由于作用域已更改,因此可以使用Laravels集合方法,即集合上的操作

DB::table('attribute_values')
    ->get()
    ->groupBy('attr_group_id')
    ->toArray();

您可以使用collection的groupBy()函数:

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

它将此字段值下具有相同属性组id的记录合并为集合的键。

Laravel版本5.8

DB::table('attribute_values')
    ->get()
    ->groupBy('attr_group_id')
    ->toArray();
因此,您需要对id进行分组 如果您需要使用模型方式,我已将模型创建为AttributeValue

$modelWay = \App\AttributeValue::get()
            ->groupBy('attr_group_id');
如果需要,在DBWay中,我已经创建了作为属性值的表

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

两者都会产生相同的结果

朋友,这是我需要的现成任务! 我自己做的,你帮了我。如果有兴趣,可以阅读。

我会向你解释为什么我需要这种特殊的方法。我正在做一个带时钟的在线商店,现在有一个任务是制作过滤器和过滤器属性。 所以有三张桌子

attribute_groups table

我需要在my.blade.php上显示Laravel小部件,如下所示

{{ Widget::run('filter', 'tpl' => 'widgets.filter', 'filter' => null,]) }} 
当我在管理面板中创建新产品时。 我必须在attribute_products中保存产品id和attribute_id,但是一个产品可以有尽可能多的属性。那么,如果我使用这个选项

$data = \DB::table('attribute_values')
            ->get()
            ->groupBy('attr_group_id')
            ->toArray(); 
我得到的结果是:

但是!每个新数组都以索引0开始。但我需要一个索引,它表示表attribute_值中的id.attr_group_id,用于保存到attribute_产品中。 在我看到唯一适合我的方法之后

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

        return $attrs;
我一直在寻找的结果


现在你可以看到有什么不同,需要什么了。数组索引从1,2,3,4,5开始,这个索引=attr_group_id。不幸的是,我一开始问不出正确的问题。谢谢大家。

对不起,我的照片。我的表:我需要结果:try
$data=\DB::table('attribute_values')->groupBy('attr_group_id')->get()您是否有此型号?如果是,请共享型号名称否我没有。我不想为此创建单独的模型。@Sohel0415它无法工作,因为您正在mysql查询中对记录进行分组,因此将从每个
attr\u group\u id
返回第一条记录,其余记录将被跳过。请检查我的问题。我做了调整并添加了我需要的:我的表格和需要的结果。这是使用Collection的优雅方式。请检查我的答案。下文将对其进行描述。我为你做的。解释了任务是什么以及如何解决。请检查我的问题。我做了调整并添加了我需要的内容:我的表格和需要的结果。请尝试@Martin Henriksensence laravel提供的答案,这样您就不需要了foreach@Drakula捕食者大级别版本请确认如果我们将按属性组id分组,它不会为同一属性组id给出两个结果,但OP的结果每个属性组id有两个记录。所以@Martin Henriksen的数据将只获取三条记录,并将跳过每个属性组id的剩余记录。请检查我的问题。我做了调整并添加了我需要的:我的表和需要的结果。@SashaSan-此函数创建一个集合,使attr\u group\u id属性作为集合键。如果你想把它转换成数组,你也可以使用collection的toArray()函数。请检查我的答案。下文将对其进行描述。我为你做的。解释了任务是什么以及它是如何解决的。你能用一些数据共享sql文件吗。我会更深入地研究它,满足你的要求。兄弟,我已经做了我需要的。。我分享我完成的任务。
$data = \DB::table('attribute_values')
            ->get()
            ->groupBy('attr_group_id')
            ->toArray(); 
$data = \DB::table('attribute_values')->get();
        $attrs = [];
        foreach ($data as $key => $value) {
            $attrs[$value->attr_group_id][$value->id] = $value->value;
        }

        return $attrs;