Laravel Eloquent - Filtrando resultados e ansiosos resultados carregados

5

Então, aqui está o caso de uso:

Você tem usuários e eles têm muitos endereços. Digamos que você queira filtrar e ansiosamente carregar nos endereços (digamos ... apenas nos endereços dos EUA). Para fazer isso, você precisa filtrar a carga e o filtro ansiosos usando whereHas , para que o conjunto de resultados seja apenas os usuários com endereços nos EUA e apenas os endereços dos EUA sejam retornados. Isso parece um pouco desajeitado.

Aqui está um exemplo:

(new App\User) ->with(['address' => function(){// filter code}]) ->whereHas('address', function(){// pretty much the same filter code}) ->get()

Existe uma maneira melhor de fazer isso? Eu sinto que estou sentindo falta de algo.

    
por Bill Garrison 06.06.2016 / 17:08
fonte

2 respostas

4

Você está confundindo whereHas e with .

O método with permitirá que você carregue o relacionamento apenas se a consulta retornar verdadeiro.

O método whereHas permite que você obtenha apenas os modelos que têm o relacionamento que retorna true à consulta.

Então, aqui:

(new App\User)->with(['address' => function($query){// filter code}])->get();

retornará todos os usuários, mas só carregará o endereço quando o código do filtro retornar verdadeiro.

E aqui:

(new App\User)->whereHas(['address' => function($query){// filter code}])->get();

retornará apenas os usuários cujo "endereço" de relacionamento retornou true no código de filtro.

    
por 15.06.2016 / 22:15
fonte
0

Você sabe que pode criar relacionamentos personalizados como? :

    class User extends Model implements...
    {
     ....

          function USAddresses(){
          return $this->
              belongsToMany(User::class,UserAddresses::class,'user_id','address_id')
              ->withPivot('postal_code')
              ->wherePivot('postal_code', !null );
     }
    } // end model

No seu controlador, então:

    $this->users->with('USAddresses')->whereHas(...)->get();

Dessa forma, você já tem seus filtros prontos. (:

    
por 19.10.2016 / 01:58
fonte

Tags