Como você verifica "se não nulo" com o Eloquent?

218

Como você verifica se um campo não é nulo no Eloquent?

Eu tentei, Model::where('sent_at', 'IS NOT', DB::raw('null'))->...mas dá IS NOTcomo uma ligação em vez de uma comparação.

Isto é o que DB::getQueryLog()diz sobre isso:

  'query' => string 'select * from my_table where sent_at = ? and profile_id in (?, ?) order by created_at desc' (length=101)
  'bindings' => 
    array (size=3)
      0 => string 'IS NOT' (length=6)
      1 => int 1
      2 => int 4
Marwelln
fonte
Você pode tentar usar em !=vez de NÃO É.
JaTochNietDan 22/01
1
@JaTochNietDan O operador! = Não funciona com valores NULL. De acordo com a documentação do MySQL : "Você não pode usar operadores de comparação aritmética como =, <ou <> para testar NULL."
Soulriser

Respostas:

402

O Eloquent tem um método para isso (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')
Bas
fonte
1
Preciso verificar o nulo no campo excluído, então mudei isso para whereNull('deleted_at')e minha consulta foi executada.
Tarunn
7
Outro recurso não documentado . Bem, a menos que você conte os documentos da API, a documentação principal do Laravel não faz nenhuma menção.
Aross1
12
O whereNotNull()método (e vários outros que não foram documentados anteriormente) foram adicionados à documentação na versão 5.1: laravel.com/docs/5.1/queries#where-clauses .
217 Ben Ben Johnson
@aross mas no Query Builder, não no Eloquent (Laravel 5.1)
pmiranda
@pmiranda não sei o que você quer dizer, mas meu comentário foi há 4 anos e sobre o Laravel 4, hoje estamos no Laravel 6. Acho que a situação mudou. Embora a documentação principal do Laravel ainda não esteja muito completa, parece mais um monte de guias.
Aross # 17/19
20

Se alguém como eu quiser fazê-lo com o construtor de consultas no Laravel 5.2.23, isso pode ser feito como ->

 $searchResultQuery = Users::query(); 
 $searchResultQuery->where('status_message', '<>', '', 'and'); // is not null
 $searchResultQuery->where('is_deleted', 'IS NULL', null, 'and'); // is null 

Ou com escopo no modelo:

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}
Atiqur
fonte
1
o que 'and'significa?
senty 29/09/16
1
Na verdade, aqui 'e' não faz nada, mas faria se o primeiro parâmetro fosse uma matriz. Aqui está o protótipo do método: public function where($column, $operator = null, $value = null, $boolean = 'and'); e localização -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur 2/16
4

Podemos usar

Model::whereNotNull('sent_at');

Ou

Model::whereRaw('sent_at is not null');
srmilon
fonte
4

Vejo que essa pergunta é um pouco antiga, mas eu a encontrei procurando uma resposta. Embora eu não tenha tido sucesso com as respostas aqui, acho que isso pode ser porque eu estou no PHP 7.2 e no Laravel 5.7. ou possível, porque eu estava apenas brincando com alguns dados na CLI usando o Laravel Tinker.

Tenho algumas coisas que tentei que funcionaram para mim e outras que, espero, não ajudarão outras pessoas.


Não tive sucesso:

    MyModel::whereNotNull('deleted_by')->get()->all();             // []
    MyModel::where('deleted_by', '<>', null)->get()->all();        // []
    MyModel::where('deleted_by', '!=', null)->get()->all();        // []
    MyModel::where('deleted_by', '<>', '', 'and')->get()->all();   // []
    MyModel::where('deleted_by', '<>', null, 'and')->get()->all(); // []
    MyModel::where('deleted_by', 'IS NOT', null)->get()->all();    // []

Todas as opções acima retornaram uma matriz vazia para mim


No entanto, tive sucesso:

    DB::table('my_models')->whereNotNull('deleted_by')->get()->all(); // [ ... ]

Isso retornou todos os resultados em uma matriz como eu esperava. Nota: você pode soltar all()e recuperar um Illuminate \ Database \ Eloquent \ Collection em vez de uma matriz, se preferir.

Rockin4Life33
fonte
0

no laravel 5.4 esse código Model::whereNotNull('column')não estava funcionando, você precisa adicionar get()como este Model::whereNotNull('column')->get();este funciona bem para mim.

Carding Ermita Sungkit
fonte
-11

Se você deseja pesquisar o registro excluído (Registro excluído suave), não use o Eloquent Model Query. Em vez disso, use a consulta Db :: table, por exemplo, em vez de usar Abaixo:

$stu = Student::where('rollNum', '=', $rollNum . '-' . $nursery)->first();

Usar:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();
user4397894
fonte
Esta resposta não tem nada a ver com a pergunta. Além disso, você não precisa usar Db::tablepara encontrar os registros excluídos. Você pode filtrá-los com o método withTrashed(), como é dito nos docs: laravel.com/docs/5.3/eloquent
gvsrepins