Фильтр Query Builder для многоуровневых глубоких отношений в Laravel - PullRequest
0 голосов
/ 10 октября 2019

У меня есть выбор сюжетов, каждый из которых принадлежит разработке с отношением hasManyThrough через housetypes. Я хочу отфильтровать их по развитию на их странице обзора. На графиках есть столбец housetype_id, а для housetypes - столбец development_id.

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

Когда я использую свой фильтр, он возвращает идентификационный номер разработки как $ development, тогда мне нужно, чтобы он отображал только графики, связанные с этой разработкой.

Я рассмотрел использованиеwhereHas или Join методы, но не смогли понять это. Текущий объем фильтра ниже. Спасибо

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

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

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

Ответы [ 4 ]

0 голосов
/ 31 октября 2019

Это было место, которое решило это в конце концов! (другой разработчик провел меня через это)

Отношения -

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

Затем возвращается любой участок, где его тип дома имеет соответствующий development_idдля filter_development из запроса.

Спасибо за всеобщее мнение

0 голосов
/ 10 октября 2019

Я бы использовал whereHas для фильтрации отношений:

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

Я бы также отредактировал область запроса, чтобы не полагаться на глобальную функцию запроса, а вместо этого передать развитие значения как параметр.

0 голосов
/ 10 октября 2019

вы сделали leftjon и затем используете, когда вам больше не нужно использовать

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);
                        })
0 голосов
/ 10 октября 2019

Если я правильно понимаю, что вы хотите установить условие для другой модели, HasMany загрузит все объекты в связанную модель после завершения запроса. Затем Eloquent связывает связанные объекты модели с каждым.

Попробуйте joins от Laravel. Я чувствую, что это именно то, что вы хотите: https://laravel.com/docs/5.8/queries#joins

...