php - specific - with laravel eloquent where




Obter colunas específicas usando a função “With()” no Laravel Eloquent (8)

Agora você pode usar o método pluck em uma instância Collection :

Isso retornará apenas o atributo uuid do Post model

App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
     all: [
       "1",
       "2",
       "3",
     ],
   }

Eu tenho duas tabelas, User e Post . Um User pode ter muitos posts e um post pertence a apenas um user .

No meu modelo de User eu tenho uma relação hasMany ...

public function post(){
    return $this->hasmany('post');
}

E no meu post modelo eu tenho uma relação belongsTo ...

public function user(){
    return $this->belongsTo('user');
}

Agora eu quero juntar essas duas tabelas usando Eloquent with() mas quero colunas específicas da segunda tabela. Eu sei que posso usar o Query Builder, mas não quero.

Quando no modelo Post eu escrevo ...

public function getAllPosts() {
    return Post::with('user')->get();
}

Ele executa as seguintes consultas ...

select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)

Mas o que eu quero é ...

select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)

Quando eu uso ...

Post::with('user')->get(array('columns'....));

Apenas retorna a coluna da primeira tabela. Eu quero colunas específicas usando with() da segunda tabela. Como eu posso fazer isso?


Ao ir para o outro lado (hasMany):

User::with(array('post'=>function($query){
        $query->select('id','user_id');
    }))->get();

Não esqueça de incluir a chave estrangeira (assumindo que é user_id neste exemplo) para resolver o relacionamento, caso contrário, você obterá zero resultados para sua relação.


Eu me deparei com esse problema, mas com uma segunda camada de objetos relacionados. A resposta de @Awais Qarni se sustenta com a inclusão da chave estrangeira apropriada na instrução de seleção aninhada. Assim como um id é requerido na primeira instrução select aninhada para referenciar o modelo relacionado, a chave estrangeira é requerida para referenciar o segundo grau de modelos relacionados; neste exemplo, o modelo da empresa.

Post::with(['user' => function ($query) {
        $query->select('id','company_id', 'username');
    }, 'user.company' => function ($query) {
        $query->select('id', 'name');
    }])->get();

Além disso, se você quiser selecionar colunas específicas do modelo Post, será necessário incluir a coluna user_id na instrução select para referenciá-lo.

Post::with(['user' => function ($query) {
        $query->select('id', 'username');
    }])
    ->select('title', 'content', 'user_id')
    ->get();

No Laravel 5.7 você pode ligar para um campo específico como este

$users = App\Book::with('author:id,name')->get();

É importante adicionar o campo foreign_key na seleção.



Note que se você precisar apenas de uma coluna da tabela, então usar 'lists' é muito bom. No meu caso, estou recuperando os artigos favoritos de um usuário, mas eu só quero o ID do artigo:

$favourites = $user->favourites->lists('id');

Retorna uma matriz de ids, por exemplo:

Array
(
    [0] => 3
    [1] => 7
    [2] => 8
)

Você também pode especificar colunas no modelo relacionado no momento de acessá-lo.

Post::first()->user()->get(['columns....']);


EmployeeGatePassStatus::with('user:id,name')->get();




laravel-query-builder