Laravel newQuery()

问题描述 投票:2回答:2

我一直在关注newQuery雄辩模型和最佳案例用法,我可以看到基于搜索页面搜索/过滤产品的好处,但是是否可以仅在用户相关产品上调用newQuery?

例如,我有2个型号。

  • 用户
  • 产品

用户有很多产品,我在用户模型上定义了关系。

public function products() {
  return $this->hasMany('App\Product');
};

现在,以前如果我想过滤所有产品并让用户退出我可以使用的场景:

$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();

这很棒,我喜欢这种方法,现在我想在仅用户产品上使用类似的功能。

例如,id喜欢:

$products = (Auth::user()->products)->newQuery();

if($request->get('category')){
  $products->whereHas('category',function($q) use($request){
     $q->where('category_id',$request->get('category'));
  });
}

$products = $query->get();

但我不能这样做我得到newQuery()方法不可用。

有没有更好的方法来执行基于参数的可选查询?

php laravel laravel-5 eloquent
2个回答
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'));
        });
    }
}]);

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();
© www.soinside.com 2019 - 2024. All rights reserved.