Coleção Eloquent: Contando e Detectando Vazio

272

Esta pode ser uma pergunta trivial, mas estou me perguntando se o Laravel recomenda uma certa maneira de verificar se uma coleção Eloquent retornada $result = Model::where(...)->get()está vazia, além de contar o número de elementos.

No momento, estamos usando !$resultpara detectar resultados vazios, isso é suficiente? Quanto a count($result), ele realmente cobre todos os casos, incluindo o resultado vazio?

bitinn
fonte

Respostas:

581

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\Collectionsempre é 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 nulloutra 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 Collectionobjeto, 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.

Gary Green
fonte
4
thx, apenas para adicionar que, se você executar uma consulta first(), o resultado será diferente de get(), que pode ser verificado com o !$resultresultado vazio.null
bitinn
2
@btinn yes - se você fez, isto é Model::first()- ele está realmente atuando no método 'first` do construtor de consultas e NÃO na coleção, portanto, ele escolherá o primeiro do banco de dados - no entanto Model::get(), retornará uma instância de Illuminate \ Support \ Coleção, então, se você fez $r = Model::get(), $r->first()ele selecionará o primeiro item dessa coleção.
Gary Green
Uma coisa que essa resposta não aborda é se count($result)funciona; adicionar esse detalhe seria uma melhoria.
Mark Amery
qual é a diferença entre $ resultado-> contagem e contagem ($ resultado) $ resultado-> contagem atinge o banco de dados novamente? Se não, acho que são os mesmos!
Kamy D
2
@ Pathath Não há uma maneira simples de fazer isso. Você precisaria percorrer cada membro da coleção usando um foreachloop e, em seguida, use uma dessas verificações (pense count($collection->column):).
PapaHotelPapa
71

Eu acho que você está procurando:

$result->isEmpty()

Isso é diferente de empty($result), o que não será verdadeiro porque o resultado será uma coleção vazia. Sua sugestão de count($result)também é uma boa solução. Não consigo encontrar nenhuma referência nos documentos

clod986
fonte
1
Que tal quando você apenas deseja verificar se uma coluna (propriedade) específica, como em $ collection-> coluna, está vazia / nula ou não?
Pathros 26/03
13

Eu concordo com a resposta aprovada acima. Mas geralmente eu uso o $results->isNotEmpty()método como indicado abaixo.

if($results->isNotEmpty())
{
//do something
}

É mais detalhado do que if(!results->isEmpty())porque às vezes esquecemos de adicionar '!' na frente, o que pode resultar em erro indesejado.

Observe que esse método existe a partir da versão 5.3 em diante.

R sathish
fonte
4

Existem vários métodos fornecidos no Laravel para verificar a contagem de resultados / verificar vazio / não vazio:

$result->isNotEmpty(); // True if result is not empty.
$result->isEmpty(); // True if result is empty.
$result->count(); // Return count of records in result.
Lovepreet Singh
fonte
4

Acho melhor usar

$result->isEmpty();

O método isEmpty retornará true se a coleção estiver vazia; caso contrário, false será retornado.

Jignesh Joisar
fonte
3

Eu acho que você tenta algo como

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

ou também usar

if (!$result) { }
if ($result) { } 
pardeep
fonte
2

Você pode fazer

$result = Model::where(...)->count(); 

para contar os resultados.

Você também pode usar

if ($result->isEmpty()){}

para verificar se o resultado está vazio ou não.

Patrick Lumenus
fonte
1

De acordo com a documentação do Laravel , você pode usar desta maneira:

$result->isEmpty();

O isEmptymétodo retornará truese a coleção estiver vazia; caso contrário, falseé retornado.

Udhav Sarvaiya
fonte
0

então o Laravel realmente retorna uma coleção quando apenas o usa, Model::all(); você não deseja uma coleção, deseja uma matriz para poder digitar defini-la. (array)Model::all();então você pode usar array_filter para retornar os resultados

$models = (array)Model::all()
$models = array_filter($models);
if(empty($models))
{
 do something
}

isso também permitirá que você faça coisas como count().

Benjamin Sweetnam
fonte
3
mantê-lo como uma coleção é realmente conveniente, para que os objetos retornados ainda possam herdar muitas funções úteis na fachada da coleção.
Gokigooooks
0

------ RESOLVIDO ------

Nesse caso, você deseja verificar dois tipos de contagem para dois intervalos

caso 1:

se o resultado contiver apenas um registro ou outra palavra, selecione uma linha do banco de dados usando -> primeiro ()

 if(count($result)){
     
       ...record is exist true...
  }

caso 2:

se o resultado contiver conjunto de várias linhas com outra palavra usando -> get () ou -> all ()

  if($result->count()) {
    
         ...record is exist true...
  }
Ravindra Bhanderi
fonte
0

Você pode usar: $counter = count($datas);

nazmulhaqued
fonte