¿Cómo se marca "si no es nulo" con Eloquent?

218

¿Cómo se verifica si un campo no es nulo con Eloquent?

Lo intenté Model::where('sent_at', 'IS NOT', DB::raw('null'))->...pero da IS NOTcomo un enlace en lugar de una comparación.

Esto es lo que DB::getQueryLog()dice al respecto:

  '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
fuente
Puede intentar usar en !=lugar de NO ES.
JaTochNietDan
1
@JaTochNietDan El operador! = No funciona con valores NULL. Según la documentación de MySQL : "No puede utilizar operadores de comparación aritmética como =, <o <> para probar NULL".
Soulriser

Respuestas:

402

Eloquent tiene un método para eso (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')
Bas
fuente
1
Necesito verificar el nulo en el campo eliminado, así que cambié esto whereNull('deleted_at')y obtuve mi consulta ejecutándose.
Tarunn
77
Otra característica indocumentada . Bueno, a menos que cuente los documentos de la API, pero la documentación principal de Laravel no lo menciona.
aross
12
El whereNotNull()método (y varios otros que no estaban documentados anteriormente) se agregaron a la documentación en la versión 5.1: laravel.com/docs/5.1/queries#where-clauses .
Ben Johnson
@aross pero en Query Builder, no en Eloquent (Laravel 5.1)
pmiranda
@pmiranda no estoy seguro de lo que quieres decir, pero mi comentario fue hace 4 años y sobre Laravel 4, hoy estamos en Laravel 6. Creo que la situación cambió. Aunque la documentación principal de Laravel todavía no está muy completa, se parece más a un montón de guías.
aross
20

Si alguien como yo quiere hacerlo con el generador de consultas en Laravel 5.2.23, puede hacerlo como ->

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

O con alcance en el modelo:

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}
Atiqur
fuente
1
¿Qué 'and'significa?
senty
1
En realidad, aquí 'y' no hace nada, pero lo haría si el primer parámetro fuera una matriz. Aquí está el prototipo del método: public function where($column, $operator = null, $value = null, $boolean = 'and'); y ubicación -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur
9

Si desea utilizar la fachada DB :

DB::table('table_name')->whereNotNull('sent_at')->get();

Jon
fuente
4

Nosotros podemos usar

Model::whereNotNull('sent_at');

O

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

Veo que esta pregunta es un poco vieja, pero la encontré buscando una respuesta. Aunque no tuve éxito con las respuestas aquí, creo que esto podría deberse a que estoy en PHP 7.2 y Laravel 5.7. o posible porque solo estaba jugando con algunos datos en la CLI usando Laravel Tinker.

Tengo algunas cosas que probé que funcionaron para mí y otras que no lo hicieron, espero que ayuden a otros.


No tuve éxito al ejecutar:

    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();    // []

Todo lo anterior me devolvió una matriz vacía


Sin embargo, tuve éxito al ejecutar:

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

Esto devolvió todos los resultados en una matriz como esperaba. Nota: puede soltar all()y recuperar Illuminate \ Database \ Eloquent \ Collection en lugar de una matriz si lo prefiere.

Rockin4Life33
fuente
0

en laravel 5.4 este código Model::whereNotNull('column')no funcionaba, debe agregar get()como este, Model::whereNotNull('column')->get();este funciona bien para mí.

Carding Ermita Sungkit
fuente
-11

Si desea buscar registros eliminados (registro eliminado suave), no utilice la consulta de modelo elocuente. En su lugar, use Db :: consulta de tabla, por ejemplo, en lugar de usar a continuación:

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

Utilizar:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();
user4397894
fuente
Esta respuesta no tiene nada que ver con la pregunta. Además de eso, no es necesario usarlo Db::tablepara encontrar los registros eliminados. Puede filtrarlos con el método withTrashed(), como se dice en los documentos: laravel.com/docs/5.3/eloquent
gvsrepins