【问题标题】:Query Builder filter for multi level deep relationship in LaravelLaravel 中多级深度关系的查询生成器过滤器
【发布时间】:2020-02-07 20:48:15
【问题描述】:

我有一个选择的地块,每个地块都属于通过房屋类型的 hasManyThrough 关系进行的开发。我想在他们的概述页面上按开发过滤这些。 Plots 有一个 housetype_id 列,而 housetypes 有一个 development_id 列。

public function plots()
  {
    return $this->hasManyThrough(Plot::class, Housetype::class);
  }

当我使用过滤器时,它会将开发 ID 号返回为 $development,然后我需要它来仅显示与该开发相关的地块。

我已经研究过使用 whereHas 或 Join 方法,但一直无法弄清楚。当前过滤器范围如下。谢谢

public function scopeFilterDevelopment($query)
    {
      $development = request()->input('filter_development');

      if ($development == "") {
        return;
      }

      if(!empty($development)){
        $query->where('development_id', $development);
      }
    }

【问题讨论】:

    标签: laravel relationship laravel-query-builder


    【解决方案1】:

    最终解决了这个问题! (工作中的另一位开发人员向我介绍了这个)

    关系 -

    public function housetype()
        {
          return $this->belongsTo(Housetype::class);
        }
    

    功能 -

    public function scopeFilterDevelopment($query)
        {
          if (request()->input('filter_development') == "") {
            return;
          }else{
            $query->whereHas('housetype', function($housetype){
              $housetype->where('development_id', request()->input('filter_development'));
            });
          }
        }
    

    然后,这将返回其房屋类型与请求中的 filter_development 匹配的 development_id 的任何地块。

    感谢大家的意见

    【讨论】:

      【解决方案2】:

      你已经做了一个leftjon然后使用when,你不必使用

      if(!empty($development)){
          $query->where('development_id', $development);
        } 
      

      这个,你可以用

      ->when($development=="" ? false : true, function($query) use ($development){
      return $query->where('development_id', $development);
      })
      

      这是一个完整的例子

      $queryBuilder =  DB::table('facturas')->
      leftJoin('clientes','clientes.id','=','facturas.clientes_id')->
      select('facturas.estados_id as estado','facturas.numero as 
      numero',DB::raw('concat(clientes.nombre," ",clientes.apellido) as cliente'))->
      when($estados===null ? false: true,function($query) use ($estados){
          return $query->whereIn('facturas.estados_id', $estados);
                              })
      

      【讨论】:

        【解决方案3】:

        我会使用 whereHas 过滤关系:

        YourModel::whereHas('plots', function($query) {
            $query->filterDevelopment();
        })->get();
        

        我还将编辑查询范围,使其不依赖请求全局函数,而是将开发值作为参数传递。

        【讨论】:

          【解决方案4】:

          如果我能正确理解您希望在其他模型上断言条件,HasMany 将在查询完成后将所有对象加载到相关模型中。然后,Eloquent 将相关的模型对象绑定到每个对象。

          改用 Laravel 的 joins。我觉得这正是你想要的:https://laravel.com/docs/5.8/queries#joins

          【讨论】:

            猜你喜欢
            • 2021-06-26
            • 1970-01-01
            • 2020-03-12
            • 2021-02-13
            • 2021-12-18
            • 2020-03-16
            • 2021-05-05
            • 1970-01-01
            • 2017-02-03
            相关资源
            最近更新 更多