我一直在研究newQuery雄辩模型和最佳案例用法,我可以看到基于搜索页面搜索/过滤产品的好处,但是是否可以仅在用户相关产品上调用newQuery?
例如,我有2个模型。
用户有很多产品,我在用户模型上定义了关系。
scanf("%d")
现在,以前如果我想过滤所有产品并让用户退出我可以使用的场景:
public function products() {
return $this->hasMany('App\Product');
};
这很棒,我喜欢这种方法,现在我想在仅用户产品上使用类似的功能。
例如,id喜欢:
$query = (new \App\Product)->newQuery();
if($request->get('category')){
$query->whereHas('category',function($q) use($request){
$q->where('category_id',$request->get('category'));
});
}
$products = $query->get();
但我不能这样做我得到newQuery()方法不可用。
是否有更好的方法可以根据参数执行可选查询?
答案 0 :(得分:3)
将您的代码更改为此代码以使其正常工作:
$products = Product::where('user_id', auth()->id());
if (request('category')) {
$products = $products->whereHas('category', function($q) {
$q->where('category_id', request('category'));
});
}
$products = $products->get();
或者,您可以使用lazy eager loading加载相关产品:
auth()->user()->load(['products' => function($q) {
if (request('category')) {
$q->whereHas('category', function($q) {
$q->where('category_id', request('category'));
});
}
}]);
答案 1 :(得分:0)
只是为了一点整洁,你也可以在构建器类上使用when()方法
auth()->user()->products()
->when($request->category, function ($query) use ($request) {
$query->whereCategoryId($request->category);
})->get();
或
Product::whereUserId(auth()->id())
->when($request->category, function ($query) use ($request) {
$query->whereCategoryId($request->category);
})->get();