
Por que whereNull não funciona com updateOrCreate no Laravel (e como evitar bugs silenciosos)
O updateOrCreate() é um dos métodos mais utilizados no Eloquent para garantir que registros sejam atualizados ou criados sem duplicações.... Leia mais
Desenvolvedor de Software
No ecossistema Laravel, há duas formas principais de interagir com o banco de dados: o Eloquent ORM e o Query Builder. Ambos têm seu espaço, mas entender quando usar cada um é essencial para escrever código limpo, performático e fácil de manter.
Neste artigo, vamos comparar essas duas abordagens, mostrar exemplos reais de uso e apontar os cenários ideais para cada uma delas. Vamos nessa?
O Eloquent é o ORM (Object-Relational Mapper) oficial do Laravel. Ele transforma tabelas em classes PHP, permitindo que você trabalhe com os dados como objetos.
Cada model representa uma tabela, e cada instância do model representa uma linha. Por trás das cortinas, o Eloquent é construído sobre o Query Builder, mas com uma interface orientada a objetos.
$candidato = Candidato::where('cpf', '123.456.789-00')->first();
Relacionamentos (hasMany
, belongsTo
, etc.)
Eventos (creating
, updated
, etc.)
Casts de atributos
Accessors e mutators
Soft deletes
Timestamps automáticos
O Query Builder oferece uma forma fluente e segura de construir queries SQL diretamente, sem precisar criar models.
Ele é ótimo para consultas complexas, operações em massa ou quando você precisa de performance e controle granular da query.
$relatorio = DB::table('inscricoes')
->select('cargo_id', DB::raw('count(*) as total'))
->where('status', 'deferido')
->groupBy('cargo_id')
->get();
Critério | Eloquent | Query Builder |
---|---|---|
Retorno | Modelos (objetos com métodos) | Objetos stdClass |
Relacionamentos | Sim | Não |
Lógica encapsulada | Sim | Não |
Eventos (creating , etc.) |
Sim | Não |
Performance | Mais pesado | Mais leve e rápido |
Facilidade para joins | Limitada | Muito flexível |
Ideal para | CRUDs com lógica de negócio | Relatórios, queries otimizadas |
Eloquent:
Pedido::create([
'candidato_id' => 1,
'tipo' => 'isenção',
'status' => 'em análise',
]);
Query Builder
DB::table('pedidos')->insert([
'candidato_id' => 1,
'tipo' => 'isenção',
'status' => 'em análise',
]);
Eloquent:
$pedido = Pedido::find(10);
$pedido->status = 'deferido';
$pedido->save();
Query Builder:
DB::table('pedidos')
->where('id', 10)
->update(['status' => 'deferido']);
Atualização em massa
// Query Builder é mais eficiente nesse caso
DB::table('pedidos')
->where('status', 'em análise')
->update(['status' => 'indeferido']);
Eloquent com soft delete:
Candidato::find($id)->delete();
Query Builder direto:
DB::table('candidatos')->where('id', $id)->delete();
Trabalhar com entidades de domínio (ex: Usuario
, Pedido
, Candidato
)
Precisar de relacionamentos
Houver lógica de negócio acoplada ao dado (validações, métodos, regras)
Quiser manter o código mais expressivo e OO
Estiver fazendo consultas com join
, groupBy
, having
, etc.
Precisar de performance em consultas de grandes volumes
Estiver lidando com scripts administrativos
Não houver necessidade de criar um model (ex: relatórios ou dashboard)
Evite carregar muitos registros com Eloquent se você não for usá-los como objetos. Prefira o Query Builder
nesse caso.
Use select()
no Eloquent para reduzir colunas carregadas:
Candidato::select('id', 'nome')->get();
Para casos híbridos (ex: usar Eloquent mas com joins manuais), você também pode usar:
Pedido::join('candidatos', 'candidatos.id', '=', 'pedidos.candidato_id')
->select('pedidos.*', 'candidatos.nome')
->get();
O Laravel te dá a liberdade de escolher entre Eloquent e Query Builder dependendo da necessidade. Em geral:
Eloquent é ideal para domínio rico, com regras e relacionamentos.
Query Builder é melhor para performance, relatórios e manipulação em massa.
A chave está em entender a intenção da operação. Se for sobre um “objeto do seu negócio”, Eloquent. Se for só “dados”, talvez o Query Builder seja mais adequado.
O updateOrCreate() é um dos métodos mais utilizados no Eloquent para garantir que registros sejam atualizados ou criados sem duplicações.... Leia mais
Recentemente enquanto utilizava o Linux Mint 21 Vera tive uma série de problemas ao instalar o PGAdmin 4 e numa... Leia mais
Neste post, você aprenderá a fazer o deploy de uma aplicação Laravel em uma VPS rodando Ubuntu com o servidor... Leia mais
Ao realizar estudos de análise de dados ou ao testar sistemas que lidam com grandes volumes de informações, é comum... Leia mais