Eu tenho duas mesas User
e Post
. Um User
pode ter muitosposts
e um post
pertence a apenas um user
.
No meu User
modelo eu tenho uma hasMany
relação ...
public function post(){
return $this->hasmany('post');
}
E no meu post
modelo eu tenho uma belongsTo
relação ...
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. Sei que posso usar o Query Builder, mas não quero.
Quando no Post
modelo 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'....));
Ele retorna apenas a coluna da primeira tabela. Quero colunas específicas usando a with()
partir da segunda tabela. Como eu posso fazer isso?
$query->select('id','username');
, eu estava recebendo #Trying to get property of non-object
id
neste caso) é necessária$query->select()
para recuperar os resultados necessários. Omiti isso no meu código e não consegui descobrir por que ele não encontrou nenhum resultado. Parvo eu! Espero que isso ajude alguém com o mesmo problemaVocê pode fazer isso assim desde o Laravel 5.5:
Cuide do
id
campo eforeign keys
conforme indicado nos documentos :Por exemplo, se o usuário pertence a uma equipe e tem uma
team_id
coluna de chave estrangeira, então$post->user->team
vazio se você não especificarteam_id
fonte
get()
métodoPost::with('user:id,username')->get(['age', 'color']);
No seu
Post
modeloO crédito original vai para o Laravel Eager Loading - Carrega apenas colunas específicas
fonte
$fields
parâmetro.Ao seguir para o outro lado (hasMany):
Não se esqueça de incluir a chave estrangeira (assumindo que seja user_id neste exemplo) para resolver o relacionamento, caso contrário, você obterá zero resultado para o seu relacionamento.
fonte
No Laravel 5.7, você pode chamar um campo específico como este
É importante adicionar
foreign_key
campo na seleção.fonte
No seu
Post
modelo:Agora você pode usar
$post->userWithName
fonte
Se você deseja obter colunas específicas usando o
with()
laravel eloquent, pode usar o código abaixo, que é originalmente respondido por @Adam em sua resposta aqui em resposta a esta mesma pergunta:Então, eu usei no meu código, mas estava me dando erro de
1052: Column 'id' in field list is ambiguous
, então se vocês também estão enfrentando o mesmo problemaPara resolvê- lo , você deve especificar o nome da tabela antes da coluna id no
with()
método como abaixo do código :fonte
Me deparei com esse problema, mas com uma segunda camada de objetos relacionados. A resposta do @Awais Qarni se mantém com a inclusão da chave estrangeira apropriada na instrução de seleção aninhada. Assim como um id é necessário na primeira instrução de seleção aninhada para referenciar o modelo relacionado, a chave estrangeira é necessária para referenciar o segundo grau de modelos relacionados; neste exemplo, o modelo da empresa.
Além disso, se você quiser selecionar colunas específicas do modelo Post, precisará incluir a coluna user_id na instrução select para fazer referência a ela.
fonte
Observe que, se você precisar apenas de uma coluna da tabela, usar 'lists' é muito bom. No meu caso, estou recuperando os artigos favoritos de um usuário, mas quero apenas os IDs do artigo:
Retorna uma matriz de IDs, por exemplo:
fonte
toArray()
!!!$user->favourites->lists('id')->toArray();
$user->favourites
será retornadoCollection
com todos os campos selecionados. O uso correto é:$user->favourites()->lists('id')
.Query\Builder::lists
método eCollection::lists
método.Você também pode especificar colunas no modelo relacionado no momento de acessá-lo.
Post::first()->user()->get(['columns....']);
fonte
Agora você pode usar o
pluck
método em umCollection
instância:Isso retornará apenas o
uuid
atributo doPost model
fonte
Tente com as condições.
fonte
fonte