Laravel 查询生成器选择数组内的返回列

Posted

技术标签:

【中文标题】Laravel 查询生成器选择数组内的返回列【英文标题】:Laravel Query Builder select return columns inside an array 【发布时间】:2021-06-04 00:57:53 【问题描述】:

我有一个这样的查询:

$task_query = DB::table('table_a')
            ->join('materials', 'table_a.material_id', '=', 'materials.id')
            ->join('products', 'table_a.product_id', '=', 'products.id')
            ->select(
                'table_a.colum_1',
                'table_a.colum_2',
                'table_a.colum_3',
                'materials.colum_1 as material_column_1',
                'materials.colum_2 as material_column_2',
                'materials.colum_3 as material_column_3',
                'products.colum_1 as product_column_1',
                'products.colum_2 as product_column_2',
                'products.colum_3 as product_column_3',
            )
            ->when( some conditions )
            ->get();

此查询返回包含我想要的所有列的平面结果。但是,我需要一种方法将一些列分组为这样的子数组:

$task_query = DB::table('table_a')
            ->join('materials', 'table_a.material_id', '=', 'materials.id')
            ->join('products', 'table_a.product_id', '=', 'products.id')
            ->select(
                'a' => [
                        'table_a.colum_1',
                        'table_a.colum_2',
                        'table_a.colum_3',
                ],
                'material' => [
                        'materials.colum_1',
                        'materials.colum_2',
                        'materials.colum_3',
                ],
                'product' => [
                        'products.colum_1',
                        'products.colum_2',
                        'products.colum_3',
                ],
            )
            ->when( some conditions )
            ->get();

我该怎么做?

【问题讨论】:

你为什么不在那之后获取数据并构建和数组 foreach / !in_array @ReubenGomes,如果我能在查询中执行一次就更好了。如果我在查询后构建数组,那就很复杂了。我将花费太多的“if - elseif - else / in_array”语句来将每一列放入 $array_a 或 $array_m 或 $array_p。 @brombeer,谢谢。我更正了。 @QuangNguyen sql 无法将数据作为数组获取,您必须构建自己的数组帖子 【参考方案1】:

据我所知,SQL 无法为您提供所需的结构。但是您可以使用map() 来重构您的第一个查询中的数据。

$data = $task_query->map(function($task) 
    return [
        'a' => [$task->column_1, $task->column_2, $task->column_3],
        'material' => [$task->material_column_1, $task->material_column_2, $task->material_column_3],
        'product' => [$task->product_column_1, $task->product_column_2, $task->product_column_3]
    ];
);

然后你可以在你的结构中使用你的数据

foreach($data as $item) 
    $item['a'];
    $item['material'];
    $item['product'];

【讨论】:

以上是关于Laravel 查询生成器选择数组内的返回列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 查询生成器中为 sql 选择列添加别名?

Laravel 查询生成器返回对象或数组?

选择所有 3 列同时不为空的位置(Laravel 查询生成器)

Laravel - 使用 Eloquent 查询构建器在选择中添加自定义列

如何将数组作为 Laravel 查询生成器的 SELECT 参数传递

使用 laravel 查询生成器在另一个表中使用列值