从 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 如果答案有助于解决相关问题,请记住将其标记为已接受/赞成,以使后续访问者受益 告诉我如何将数据添加到链接表中 您可以使用attach
、detach
或sync
关联相关记录laravel.com/docs/8.x/…
谢谢!一切顺利。以上是关于从 laravel 中的多个表中正确输出分组数据的主要内容,如果未能解决你的问题,请参考以下文章