Por que whereNull não funciona com updateOrCreate no Laravel (e como evitar bugs silenciosos)
Paulo Bolsanello·25 Abr 2025·2 min de leitura
O updateOrCreate() é um dos métodos mais utilizados no Eloquent para garantir que registros sejam atualizados ou criados sem duplicações. Porém, muitos desenvolvedores (inclusive os mais experientes) acabam caindo numa armadilha silenciosa: o uso de campos NULL — especialmente o deleted_at — na cláusula de condição.
O updateOrCreate() do Eloquent traduz internamente o array de condições em comparações simples =. Então quando você faz 'deleted_at' => null, o Laravel não gera um WHERE deleted_at IS NULL, e sim:
WHERE deleted_at = null
O problema? Em SQL, = NULL nunca é verdadeiro. O resultado é que:
Nenhum registro é encontrado,
Eloquent presume que precisa criar um novo,
E você acaba com registros duplicados, mesmo que pareça que está fazendo tudo certo.
Agora sim, a consulta IS NULL funciona corretamente, e você evita duplicações silenciosas.
💡 Dica extra: proteja no banco
Mesmo com a lógica certa no código, ainda é possível cometer erros. Garanta unicidade no banco com índices condicionais:
CREATE UNIQUE INDEX idx_user_unico
ON minha_tabela (user_id)
WHERE deleted_at IS NULL;
O método updateOrCreate é poderoso, mas não foi feito para lidar com NULL em comparações de forma transparente. Use whereNull() quando necessário e, se possível, complemente com um índice único no banco de dados.
Recentemente enquanto utilizava o Linux Mint 21 Vera tive uma série de problemas ao instalar o PGAdmin 4 e numa conversa com um colega de trabalho surgiu a oportunidade de vir a utilizar o Debian. A recomendação inicial…
Se você está começando a aprender Go e quer fazer algo prático, vou te mostrar como criar uma aplicação básica que permite incluir, editar, listar e remover pessoas. O objetivo aqui é aprender de uma forma leve. Os…