Ao usar, ->get()
você não pode simplesmente usar qualquer um dos itens abaixo:
if (empty($result)) { }
if (!$result) { }
if ($result) { }
Porque se você dd($result);
perceber que uma instância de Illuminate\Support\Collection
sempre é retornada, mesmo quando não há resultados. Essencialmente, o que você está verificando é o $a = new stdClass; if ($a) { ... }
que sempre retornará verdadeiro.
Para determinar se existem resultados, você pode executar um dos seguintes procedimentos:
if ($result->first()) { }
if (!$result->isEmpty()) { }
if ($result->count()) { }
if (count($result)) { }
Você também pode usar em ->first()
vez de ->get()
no construtor de consultas que retornará uma instância do primeiro modelo encontrado ou de null
outra forma. Isso é útil se você precisar ou estiver esperando apenas um resultado do banco de dados.
$result = Model::where(...)->first();
if ($result) { ... }
Notas / Referências
Informações sobre bônus
As diferenças Collection e Query Builder podem ser um pouco confusas para os iniciantes no Laravel, porque os nomes dos métodos geralmente são os mesmos entre os dois. Por esse motivo, pode ser confuso saber em quem você está trabalhando. O Query Builder basicamente constrói uma consulta até você chamar um método em que ele executará a consulta e atingirá o banco de dados (por exemplo, quando você chama certos métodos como ->all()
->first()
->lists()
outros). Esses métodos também existem no Collection
objeto, que podem ser retornados do Query Builder se houver vários resultados. Se você não tiver certeza de qual classe está realmente trabalhando, tente fazer var_dump(User::all())
e experimentar para ver quais classes ela realmente está retornando (com a ajuda deget_class(...)
) Eu recomendo que você verifique o código-fonte da classe Collection, é bem simples. Em seguida, confira o Query Builder e veja as semelhanças nos nomes das funções e descubra quando ele realmente atinge o banco de dados.
first()
, o resultado será diferente deget()
, que pode ser verificado com o!$result
resultado vazio.null