使用laravel从数据透视表搜索的最佳方法

时间:2019-01-17 07:21:03

标签: laravel eloquent pivottable.js

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

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

3 个答案:

答案 0 :(得分:2)

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

$categoryId = 1;

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

上面的代码将返回ID等于$categoryId的“类别”中的所有产品。

答案 1 :(得分:1)

您可以eager load个产品用于给定类别。试试:

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

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

然后在Blade视图中可以执行以下操作:

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

答案 2 :(得分:0)

您可以在控制器的方法内部使用它。仅当$ request-> $ query(search)具有值时,此方法才有效。然后在这里,我们使用areHas获取模型的关系,并使用->()用于get的关系。数据透视表值

->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}%")
     });})