Laravel 类别、子类别和模型绑定
Posted
技术标签:
【中文标题】Laravel 类别、子类别和模型绑定【英文标题】:Laravel Categories, Subcategories and model binding 【发布时间】:2021-08-09 12:55:09 【问题描述】:我有两个表:产品和类别。每个产品都有特定的类别。
products 表有 category_id。 类别表有 name 和 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>
【问题讨论】:
请显示您的类别型号。 你能在 productCategory 函数中获取 $slug 名称吗? @Shahrukh 我更新了我的帖子。 @YasinPatel 是的,使用 dd($category);我正在获取包括蛞蝓在内的所有数据。 @user2519032,目前您正在获取所有产品吗? bcs 你没有在任何地方使用 $category 【参考方案1】:在您的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',function($q) use ($slug)
$q->where('name', 'like', '%' . $slug . '%');
);
)->get();
【讨论】:
我刚刚尝试过,但出现语法错误。您可以查看链接。 哪一个,我只是在这里输入 添加;在orwhereHas之后 我仍然遇到同样的错误。您可以在我的主帖的实时链接中看到。 立即复制查询【参考方案2】:我觉得你可以使用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
希望对你有用!
【讨论】:
以上是关于Laravel 类别、子类别和模型绑定的主要内容,如果未能解决你的问题,请参考以下文章