¿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

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')

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', '<>', '');
}

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();


4

Nosotros podemos usar

Model::whereNotNull('sent_at');

O

Model::whereRaw('sent_at is not null');

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.


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í.


-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();

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.