问题描述
我有两个表:产品和类别。每个产品都有特定的类别。
products 表有 category_id。 类别表具有名称和 parent_id。
这是我的示例产品:iPhone 12。 在管理部分,我有类别 Apple 和子类别 iPhone,然后我将产品 (iPhone 12) 放在子类别 iPhone 中。
在前端部分,我可以成功显示类别树无序列表,当我单击子类别 iPhone 时,产品 iPhone 12 显示正常,但是当我单击类别 Apple 时,产品不显示。如何显示父类的数据,所以当我点击 Apple 类别或 iPhone 子类别时,在这两种情况下都显示产品?
这是我的代码:
模型类别
public function products()
{
return $this->hasMany('App\Models\Product');
}
public function children() {
return $this->hasMany('App\Models\Category','parent_id');
}
类别模型
public function products()
{
return $this->hasMany('App\Models\Product');
}
产品控制器
public function productCategory(Category $category) {
$categories = Category::with('children')->whereNull('parent_id')->where('status',1)->get();
$products = $category->products;
return view('products',compact('products','categories'));
}
路线
Route::get('/category/{category:slug}','App\Http\Controllers\ProductController@productCategory')->name('product.category');
产品视图:
<div class="content products">
<div class="container">
<div class="row">
<div class="col-md-3">
<div class="categories">
<ul>
@foreach($categories as $category)
<li>
<a href="{{ route('product.category',$category->slug) }}">{{ $category->name }}</a>
@if($category->children)
<ul>
@foreach($category->children as $child)
<li>
<a href="{{ route('product.category',$child->slug) }}">{{ $child->name }}</a>
</li>
@endforeach
</ul>
@endif
</li>
@endforeach
</ul>
</div>
</div>
<div class="col-md-9">
<div class="row">
@foreach($products as $product)
<div class="col-sm-4">
<div class="image">
<a href="{{ route('product',$product->slug) }}"><img class="img-fluid" src="{{ Storage::url($product->image) }}" /></a>
</div>
<div class="title">
<h3>{{ $product->title }}</h3>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
解决方法
我认为你可以使用 laravel 提供的 hasManyThrough
函数
在类别模型中添加这些功能
//retrunt only the subcategories of the category
public function subcategories()
{
return $this->hasMany(Category::class,'parent_id');
}
//return the products directly by the parent category
public function categotyProducts()
{
return $this->hasManyThrough(
Product::class,category::class,'parent_id','category_id',);
}
有关详细信息,请参阅 docs
希望对你有用!
,在您的 Product
模型中定义类别关系如下。
public function category()
{
return $this->belongsTo('App\Models\Category','category_id');
}
在您的控制器函数中定义 slug 变量并使用以下查询来获取产品
$slug = ($category->slug)??'';
产品查询:
$products = Product::where(function($query) use ($slug){
$query->whereHas('category',function($q) use ($slug){
$q->where('name','like','%' . $slug . '%');
})
->orWhereHas('category.children','%' . $slug . '%');
});
})->get();