gpt4 book ai didi

php - 如何使用 Eloquent 方式通过具有嵌套关系(belongsToMany)的子类别来计算父类别中的产品

转载 作者:行者123 更新时间:2023-12-04 04:21:17 26 4
gpt4 key购买 nike

我正在尝试计算父类别中的所有事件产品。父类别有许多子类别(只有一层深)。一个产品可以分配给多个子类别,但不能分配给父类别。

例如。我的“玩具”( parent )类别有 3 个子类别“男孩”(有 5 种产品)、“女孩”(有 6 种产品)、“青少年”(有 12 种产品)。

我主页的侧边栏菜单有所有的父类别,想用 Eloquent 方式显示各个父类别的产品数量。 Eloquent 查询正在 View 编辑器中使用。

使用上面的示例,我想显示如下:

Toys  23 (5 + 6 + 12 = 23 after totaling products from child categories)  

Games 10

Sports 15

and so on..

我想获得包含产品数量的父类别,而不是子类别的详细信息。

我的 Category.php 模型

public function parent() {
return $this->belongsTo(self::class, 'parent_id');
}

public function children() {
return $this->hasMany(self::class, 'parent_id', 'id');
}

public function products() {
return $this->belongsToMany('App\Product');
}

我的 Product.php 模型

public function categories() {
return $this->belongsToMany('App\Category');
}

public function user() {
return $this->belongsTo('App\User');
}

我试过的查询

Category::select('id', 'parent_id', 'slug' ,'name')->where(['active' => 1, 'parent_id' => null])->with(['children' => function($query) {
$query->withCount('products');
}])->get();

这会给我 child 的产品数量。我可以遍历 child 并可以为 parent 添加总产品。但是,这似乎不是我的好方法,因为这也会加载我不需要的子类别数据。我总共有大约 400 个类别。

Category::select('id', 'parent_id', 'slug' ,'name')->where(['active' => 1, 'parent_id' => null])->with('children')->withCount('products')->get();

这使产品计数为 0,显然是因为父类别没有分配给它的产品。

我看到很多她使用 withCount 的例子,但他们都解释了 hasManyThrough 关系。我在类别和产品模型中设置了 belongsToMany 关系。如果 withCount 在任何地方的 belongsToMany 关系中实现,请指导我。

我正在寻找优化的数据库查询以获得我需要的结果。请告诉我您的想法。

非常感谢您抽出宝贵的时间。

最佳答案

如果我正确理解您的问题,您可以通过向您的类别模型添加一个方法来实现这一点。像这样

// Category.php
public function getProductCountAttribute()
{
return Product::whereIn(
'category_id',
Category::where('parent_id', $this->getKey())->pluck('id');
)
}

这将从以当前类别为父类别的类别中获取所有 ID。然后使用 id 获取属于子类别的所有产品并计算它们。

上面的方法是一个访问器,因此您可以像 $toyCategory->product_count 那样在玩具类别上调用它​​

希望这能回答您的问题并引导您朝着正确的方向前进。

旁注:这将为每个类别生成一个查询,这不是理想的方式,但它比为每个类别子生成一个查询要好。

关于php - 如何使用 Eloquent 方式通过具有嵌套关系(belongsToMany)的子类别来计算父类别中的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59246070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com