Selecionando cuidadosamente com Laravel Joins

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 userse posts. Ambos possuem idcolunas e postsum user_idque é uma chave estrangeira para a userstabela.

Para juntar as duas tabelas, você usa o #joinmé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 idcolunas retornadas e, internamente, o idatributo é definido como a segunda coluna (da poststabela).

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