【问题标题】:best approach to search from pivot table using laravel使用 laravel 从数据透视表中搜索的最佳方法
【发布时间】:2019-06-11 08:28:17
【问题描述】:

使用 laravel 从数据透视表中搜索。

这是我的表结构:

Product
id
name

Categories
id
name

product_category (Pivot table)

id
category_id
product_id

//products can have multiple categories 

产品型号:

public function categories(){
     return $this->belongsToMany(Category::class, 'product_category');
}

按类别 ID 搜索所有产品的最佳方法是什么? 目前我正在这样做,这似乎不是一种有效的方式:

//Controller
$categories = product_category::where('category_id',1)->get();

现在我必须遍历类别,然后获取产品并将其传递给视图?知道如何以有效的方式做到这一点吗?

【问题讨论】:

    标签: laravel eloquent pivottable.js


    【解决方案1】:

    为此,您可以使用whereHas() 方法:

    $categoryId = 1;
    
    $products = Product::whereHas('categories', function ($query) use($categoryId) {
        $query->where('id', $categoryId);
    })->get();    
    

    上面将返回 ID 等于 $categoryId 的 Category 中的所有产品。

    【讨论】:

    • 我认为在这种特定情况下应该是:$query->where('category_product.category_id', $categoryId);。否则,您将收到 ambiguous column name 异常,因为枢轴上有一个 id 列。
    • 谢谢你的好建议,我会努力实现这个@Amade
    【解决方案2】:

    您可以eager load 给定类别的产品。试试:

    $category = Category::with('products')->where('category_id',1)->find(1);
    

    执行此操作时,只会执行 2 个数据库查询:一个用于加载类别,一个用于加载相关产品。

    然后在你的 Blade 视图中你可以这样做:

    @foreach($category->products as $product
        {{ $product->name }}
    @endforeach
    

    【讨论】:

      【解决方案3】:

      您可以在控制器的方法中使用它..这仅在 $request->$query(search) 具有值时才有效。然后在这里我们使用 wereHas 来获取模型的关系和 with->() 用于获取数据透视表值

      ->when($request->query('search'), function ($query)use($request) {
      
         $q= $request->query('search');
      
         return $query->whereHas('relation name', function (Builder $query) use ($q) {
                        
         $query->with('pivot table name.column name')  
      
        ->where('pivot table name.column name', 'like', "%{$q}%")
           });})
      

      【讨论】:

      • 你能分解一下代码并解释一下吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多