我有以下数据库结构:
products: id, product_id, name, desc, etc...
categories: id, name, slug
product_category: product_id, category_id
product_colors: product_id, color_id
product_sizes: product_id, size_id
colors: id, value, hex
sizes: id, value
我还有路线:/ category / {slug},用户可以看到某个类别下的所有产品,并有一个侧边栏按价格和其他类别过滤它们。什么是检索所有产品颜色的最佳方法,特别是在类别下加载的产品,不同的值,因此不会有重复的颜色。
查询检索产品:
Product::whereHas('categories', function ($q) use ($cat_ids) {
return $q->whereIn('id', $cat_ids);
})->with(['colors', 'sizes', 'brand'])->get();
编辑: 检索颜色和大小:
$sizes = collect($products->pluck('sizes'))->flatten()->pluck('value', 'id');
$colors = collect($products->pluck('colors'))->flatten()->pluck('value', 'id');
Product.php:
public function categories() {
return $this->belongsToMany(Category::class, 'product_category');
}
public function colors() {
return $this->belongsToMany(Color::class, 'product_colors');
}
public function sizes() {
return $this->belongsToMany(Size::class, 'product_sizes');
}
Category.php
public function products() {
return $this->belongsToMany(Product::class, 'product_category');
}
Color.php
public function products() {
return $this->belongsToMany(Product::class, 'product_colors');
}
Size.php
public function products() {
return $this->belongsToMany(Product::class, 'product_sizes');
}
答案 0 :(得分:0)
这是一个非面向集合的方法: 循环浏览类别中的产品,调用颜色函数。将每个结果添加到数组中。完成后,删除重复项。
这将完成您的要求,但如果您希望原始产品仍然附加到颜色(基本上是不同的返回数据结构),您将需要指定它应该是什么样子。
答案 1 :(得分:0)
在您的类别中,假设您有多个产品属于一个类别
修改你的Category.php(更有意义)
public function products()
{
return $this->belongsToMany(Product::class, 'product_category');
}
获取像这样的基础集合
$categories = Categories::with('products')->all();
然后您将拥有所有产品类别
然后你将有一个嵌套的集合
collection =>
1 => Category [ // category collection
products => collection() => [ // the products colection
colors => collection() // colors collection
]
]
您可以使用正常的foreach循环访问产品。
foreach($categories as $category)
{
// since you already have the relationship setup. you can call the
// relationship easily like this.
foreach($category->products as $product)
{
// products model
foreach($product->colors as $color)
{
// your colors model.
}
}
}