我一直在研究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()方法不可用。

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

    最佳答案

    更改您的代码以使其正常工作:

    $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'));
            });
        }
    }]);
    

    09-25 19:06