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 类别、子类别和模型绑定的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 的导航菜单中列出类别 - 子类别

Laravel - 从 ajax 响应数据中的产品 (belongsTo) 访问子类别。

Laravel 类别、子类别和帖子

如何在 Laravel 刀片类别下获取子类别

Laravel - 类别的种子数据

在 laravel 网站中制作子类别