构建查询以检索可用的产品颜色

时间:2017-11-04 12:20:44

标签: php laravel laravel-eloquent

我有以下数据库结构:

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');
}

2 个答案:

答案 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.
      }

   }
}