Laravel 5 / Eloquent - 属于多对多关系的查询过滤

Laravel 5 / Eloquent - query filtering on belongs-to-many relation

假设我的数据库中有这些关系:

产品

编号 |姓名

类别

编号 |姓名

产品类别

编号 | product_id | category_id


我可以使用 Eloquent 的模型使用“belongsToMany”关系轻松构建它: 产品有一个名为“类别”的“类别”public 函数,类别有一个“产品”public 函数。

现在,我有一个页面,用户希望通过单击类别名称来过滤给定类别的所有产品。

程序会将 category_id 传递给我的控制器,现在开始解决问题。

我可以轻松地“手动”完成此代码:

            $products = Product::query()
            ->leftJoin('product_category', 'product.id', '=', 'product_category.product_id')
            ->leftJoin('category', 'product_category.category_id', '=', 'category.id')
            ->where('category_id', '=', 2);

但这会使在模型中定义关系的过程class几乎毫无用处。

是否有更好的制作方法,也许使用 ORM 的东西?

非常感谢!

使用whereHas:

$products = Product::whereHas('categories', function ($q) {
    $q->where('id', request()->input('category_id'));
})->get();

参见Querying Relationship Existence