我有关联的模型类别:
public function attribute()
{
return $this->hasMany('App\Models\Attribute');
}
public function children()
{
return $this->hasMany(self::class, 'parent_id');
}
public function products()
{
return $this->hasMany('App\Models\Product');
}
如何从儿童类别(如果存在)中获取产品的最低价格。
此代码:
$category = Category::whereId('id', $categoryId)->first();
if($category->children) $products = $category->children()->products()->min('price'); }
不起作用。我收到错误消息:
Method Illuminate\Database\Query\Builder::products does not exist. (View:
答案 0 :(得分:0)
对$category->children()
的调用很可能会返回一个集合。因此,您将不得不遍历孩子以获得每个孩子的products
。
例如:
foreach ($category->children() as $cat){
$price = $cat->products()->min('price');
//append to price array for each child
}
答案 1 :(得分:0)
您的children()
方法的返回值是一个集合,因此您不能在该集合上调用产品。您要么必须对集合进行迭代并获得每个类别的最低价格,要么将您的产品组合在一起,并获得每个类别的最低价格:
$childrenWithMinPrices = $category->children()
->join('products', 'products.category_id', '=', 'categories.id')
->select('categories.*', DB::raw('MIN(products.price) AS minPrice'))
->groupBy('categories.id')
->get();
您可能必须在上面的查询中更改表名和列名以适合您的模式。
注意:我将此写在脑海中,我可能会弄错语法。请让我知道是否有任何问题。