微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 类别、子类别和模型绑定

如何解决Laravel 类别、子类别和模型绑定

我有两个表:产品和类别。每个产品都有特定的类别。

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();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。