我有一个关于 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,因为我想优化代码。 我该怎么做才能让它变得更简单???
更多信息请阅读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);
}
我建议您在类别模型中使用嵌套集合结构。
在这个包中实现得很好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);