从 laravel 中的多个表中正确输出分组数据

Posted

技术标签:

【中文标题】从 laravel 中的多个表中正确输出分组数据【英文标题】:Correctly output grouped data from multiple tables in laravel 【发布时间】:2021-03-19 02:06:42 【问题描述】:

一个集合中所有数据的输出存在问题。 有 3 个表示例:类别、产品组、产品。 我尝试通过 lanks 链接表,但由于产品表可以没有组,因此情况并非如此。

迁移

categories
-id
-title
...
products_group
-id
-title
...
products
-id
-title
-category_id
-product_group_id
...

型号

category
public function products()
    
        return $this->hasMany(Product::class, 'category_id');
    
products_group
public function products()
    
        return $this->hasMany(
            Product::class
        )->whereNull('product_group_id');
    

产品可以在没有它的组中。 如何发出请求以生成这种格式的响应:

$result = [
            [
                'category_id' => 1,
                'title' => 'Category 1',
                'items' => [
                    [
                        'id' => 1,
                        'title' => 'Product group 1',
                        'products' => [
                            [
                                'title' => 'product 1',
                                'product_group_id' => 1,
                                '...'
                            ],
                            [
                                'title' => 'product 2',
                                'product_group_id' => 1,
                                '...'
                            ]
                        ]
                    ],
                    [
                        'id' => 2,
                        'title' => 'Product group 2',
                        'products' => [
                            [
                                'title' => 'product 1',
                                'product_group_id' => 1,
                                '...'
                            ],
                            [
                                'title' => 'product 2',
                                'product_group_id' => 1,
                                '...'
                            ]
                        ]
                    ]
                ]
            ],
            [
                'category_id' => 2,
                'title' => 'Category 2',
                'items' => [
                    [
                        'title' => 'product 3',
                        'product_group_id' => null,
                        '...'
                    ],
                    [
                        'title' => 'product 4',
                        'product_group_id' => null,
                        '...'
                    ]
                ]
            ],
            [...]
        ];

这不是怎么形成的。

【问题讨论】:

“产品可以在没有它的组中”是什么意思? return $this->hasMany(Product::class)->whereNull('product_group_id'); 对我来说没有意义。对于您想要的输出,Category 和 ProductGroup 之间需要有关系 我无法想象如何在 Gategory 和 ProductGroup 之间建立连接。如果您将这些表与中间表链接,那么您将不得不再次请求获取没有 ProductGroup 的产品。但是是否可以将 Gategory 和 ProductGroup 与 Product 表联系起来? 将 Category 和 ProductGroup 与中间数据透视表链接 - 然后查询可以采用 Category::with(['product_groups.products', 'products'])->get() 的形式,以获取与任何 ProductGroup 关联的所有产品以及与 a 中的任何 ProductGroup 不关联的产品单个查询 据我了解 Category 和 ProductGroup 之间的关系这样做public function product_groups() return $this->hasManyThrough( ProductGroup::class, Product::class, 'category_id', // Foreign key on users table... 'id', // Foreign key on posts table... 'id', // Local key on countries table... 'product_group_id' // Local key on users table... )->groupBy('product_group_id'); 请不要将代码放入 cmets。编辑您的问题以添加此信息。 【参考方案1】:

@Donkarnash 这很清楚,我的意思是在产品分组的那些类别中,它们正常显示,但相同的产品也显示在产品数组中的相同类别

在急切加载关系时可以有一个约束

$categories = Category::with([
    'product_groups.products',
    'products' => function($query)
        $query->whereNull('product_group_id');
    
)->get();

这将立即加载所有 ProductGroup 记录以及 ProductGroup 中的相关产品记录,以及与类别关联但不与任何 ProductGroup 关联的产品记录。

以上查询假设您有一个数据透视表category_product_group,并且Category 和ProductGroup 两边都有belongsToMany 关系

//category_product_group
 - category_id
 - product_group_id
//with composite primary key of category_id & product_group_id

关系

//Category.php
public function product_groups()

    return $this->belongsToMany(ProductGroup::class);


//ProductGroup.php
public function categories()

    return $this->belongsToMany(Category::class);

【讨论】:

谢谢,我也只是把条件弄错地方了。 @ValenokPC 如果答案有助于解决相关问题,请记住将其标记为已接受/赞成,以使后续访问者受益 告诉我如何将数据添加到链接表中 您可以使用attachdetachsync关联相关记录laravel.com/docs/8.x/… 谢谢!一切顺利。

以上是关于从 laravel 中的多个表中正确输出分组数据的主要内容,如果未能解决你的问题,请参考以下文章

根据Laravel Vue Js Api中的关系从多个表中删除数据

Vue(Laravel 8)无法正确呈现存储在表中的数组

Laravel - 将多个数组作为新行插入?

从多个表中获取数据 Laravel

Laravel中从一个表到另一个表中的同一字段的多个外键

Laravel - 从不同的表中获取总和并计算