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.
No seu modelo Post
public function user()
{
return $this->belongsTo('User')->select(array('id', 'username'));
}
O crédito original vai para o Laravel Eager Loading - Carrega apenas colunas específicas
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();