Ao juntar duas tabelas no Laravel, você deve ser específico sobre o que está selecionando.
Laravel junta-se
Digamos que você tenha duas tabelas users
e posts
. Ambos possuem id
colunas e posts
um user_id
que é uma chave estrangeira para a users
tabela.
Para juntar as duas tabelas, você usa o #join
método
$user = User
::join('posts', 'posts.user_id', '=', 'users.id')
->first();
Mas os resultados que você obtém podem ser surpreendentes
print $user->id; //prints the id of the posts table
O problema
A consulta gerada por uma cláusula de junção usa um select all por padrão, então você pode substituir colunas acidentalmente
SELECT * FROM users INNER JOIN posts ON posts.user_id = users.id
Isso resulta em duas id
colunas retornadas e, internamente, o id
atributo é definido como a segunda coluna (da posts
tabela).
A solução
Para contornar esse problema, certifique-se de ser específico com sua cláusula select
$user = User
::join('posts', 'posts.user_id', '=', 'users.id')
->select('users.*')
->first();
Agora os resultados são o que você esperaria
print $user->id; //prints the id of the users table