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();
假设我的数据库中有这些关系:
产品
编号 |姓名
类别
编号 |姓名
产品类别
编号 | 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();