Laravel 雄辩的类别

问题描述 投票:0回答:2

我有一个关于 Laravel 中 eloquent 的问题。

数据库表

类别:id root_id 名称

产品ID名称等..

产品类别 ID 产品 ID 类别 ID

因此,CategoryA 可能有一个子 CategoryB,而 CategoryB 本身可能有一个子 CategoryC。

当我单击类别 A 时,我想查找属于类别 A、类别 B、类别 C 的所有产品

Category Model

   public function cats()
    {
        return $this->hasMany(Category::class);
    }


    public function childrenCategories()
    {
        return $this->hasMany(Category::class)->with('cats');
    }

产品型号

public function categories()
    {
        return $this->belongsToMany(Category::class);
    }

控制器

//首先我得到所有类别的所有id,所有级别的子类别。

        $categories = Category::where('category_id',$category_id)->with('childrenCategories')->get();
        $all_cat_array=array();$all_prod=array();

foreach ($categories as $category)
{
    foreach ($category->childrenCategories as $childCategory) {
        array_push($all_cat_array, $childCategory->id);
    }
    array_push($all_cat_array,$category->id);

}

//然后我得到所有产品的ID

foreach ($all_cat_array as $cat)
{
    if(CategoryProduct::where('category_id',$cat)->exists()) {
        $prod=CategoryProduct::where('category_id',$cat)->pluck('product_id');
        array_push($all_prod,$prod );
    }
}

但是我不想使用所有这些foreach,因为我想优化代码。 我该怎么做才能让它变得更简单???

php laravel eloquent
2个回答
0
投票

更多信息请阅读Laravel 文档

数据库

A类数据库

Schema::create('category_as', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->unsignedBigInteger('product_id');
  ...
  $table->timestamps();

  $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
});

B类数据库

Schema::create('category_bs', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->unsignedBigInteger('category_a_id');
  ...
  $table->timestamps();

  $table->foreign('category_a_id')->references('id')->on('category_as')->onDelete('cascade');
});

型号

产品型号

public function categories_a() {
  return $this->hasmany(Category_a::class);
}

A类型号

public function categories_b() {
  return $this->hasmany(Category_b::class);
}

public function product() {
  return $this->belongsTo(Product::class);
}

B类型号

public function category_a() {
  return $this->belongsTo(Category_a::class);
}

public function clients() {
   return $this->hasManyThrough(Client::class, Code::class);
}

控制器

public function index() {
  $products = Product::all();
  $query = $products->categories_a->categories_b;
  dd($query);
}

已编辑

数据库

A类数据库

Schema::create('categories', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->unsignedBigInteger('product_id');
  ...
  $table->timestamps();

  $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
});

型号

产品型号

public function categories() {
  return $this->hasmany(Category::class);
}

类别型号

public function product() {
  return $this->belongsTo(Product::class);
}

控制器

public function index() {
  $products = Product::all();
  $query = $products->categories;
  dd($query);
}

0
投票

我建议您在类别模型中使用嵌套集合结构。

在这个包中实现得很好https://github.com/lazychaser/laravel-nestedset.

您可以通过 2 个查询获取该类别的产品及其所有后代(无限嵌套)。

如果类别属于多个产品:

$categoryIds = Category::descendantsAndSelf($categoryId)->pluck('id');

$products = Product::whereHas('categories', function ($query) use ($categoryIds) {
    $query->whereIn('categories.id', $categoryIds);
});

如果类别有很多产品

$categoryIds = Category::descendantsAndSelf($categoryId)->pluck('id');

$products = Product::whereIn('category_id', $categoryIds);
© www.soinside.com 2019 - 2024. All rights reserved.