1
resposta

[Dúvida] Laravel - Eloquent - join

Boa Tarde comunidade. Estava praticando em um projeto Laravel. E me deparei com o seguinte cenário.

Tenho duas tabelas que apresentam os campos de created_at e updated_at, assim como o campo de id para cada uma delas.

No momento em que eu realizo o join entre elas. A resposta apresentam com os dados meio que 'sobrescrito'.

Esse é o resultado

 attributes: array:10 [
    "identifier" => 3511
    "date_buy" => "2023-01-01 21:00:32"
    "produto_id" => 12355
    "cliente_id" => 354844
    "deleted_at" => null
    "created_at" => "1982-06-10 10:05:05" # Esse campo deveria ser da venda e não da pessoa que comprou.
    "updated_at" => null
    "name" => "Kendric One"    
    "phone" => "(11) 91111-1111"
  ]

Esse campo de created_at, está vindo com o valor da tabela de cliente.

O que eu fiz?

  • DocLaravel, Foi essa doc que estava utilizando para resolver essa questão.
  • Uma solução que encontrei foi nomear em um 'select' todos os campos que gostaria que aparecesse e aplicar um alias para os que se repetiam.

Mas ainda sim gostaria de ouvir a opinião dos colegas, se já tiveram esse cenário e se utilizaram uma solução diferente dessa? Algo que tenha no laravel que faça automáticamente essa diferenciação.

Desde já agradeço a colaboração de todos. Bons estudos!!

1 resposta

Olá, Washington. Tudo bem?

Obrigado por compartilhar aqui com a gente. Parabéns pela solução.

Muito legal você pensar em usar aliases para resolver o problema do join e para evitar sobrescritar campos com nomes semelhantes entre as tabelas. Uma solução interessante para o seu caso é o uso de métodos como select() e addSelect(), que permitem especificar quais campos você quer trazer, e ainda usar aliases para campos duplicados. Isso ajuda a manter os nomes dos campos bem definidos.

Uma alternativa para esse tipo de situação é utilizar o método join() e adicionar os campos desejados com alias diretamente no query builder. Veja um exemplo de código:


$dados = DB::table('vendas')
    ->join('clientes', 'vendas.cliente_id', '=', 'clientes.id')
    ->select('vendas.id as venda_id', 'clientes.id as cliente_id', 'vendas.created_at as venda_created_at', 'clientes.created_at as cliente_created_at')
    ->get();

Esse código seleciona explicitamente os campos de cada tabela e dá aliases para evitar a sobreposição. Ele retorna as informações com nomes distintos para created_at, facilitando o uso posterior.

Conte com o apoio do Fórum. Abraços e bons estudos!