Hoe controleer je “indien niet null” met Eloquent?

Hoe controleer je of een veld niet nullis bij Eloquent?

Ik heb Model::where('sent_at', 'IS NOT', DB::raw('null'))->...geprobeerd maar het geeft IS NOTals een binding in plaats van een vergelijking.

Dit is wat DB::getQueryLog()erover zegt:

 '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

Antwoord 1, autoriteit 100%

Eloquent heeft daar een methode voor (Laravel 4.*/5.*);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

Antwoord 2, autoriteit 4%

Als iemand zoals ik het wil doen met de querybuilder in Laravel 5.2.23, kan dat als ->

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

Of met scope in model :

public function scopeNotNullOnly($query){
    return $query->where('status_message', '<>', '');
}

Antwoord 3, autoriteit 2%

Als je de DB-gevelwilt gebruiken:

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


Antwoord 4, autoriteit 2%

We kunnen gebruiken

Model::whereNotNull('sent_at');

Of

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

Antwoord 5

Ik zie dat deze vraag een beetje oud is, maar ik kwam hem tegen op zoek naar een antwoord. Hoewel ik geen succes had met de antwoorden hier, denk ik dat dit kan zijn omdat ik op PHP 7.2en Laravel 5.7.gebruik of mogelijk omdat ik gewoon aan het spelen was met wat gegevens over de CLI met behulp van Laravel Tinker.

Ik heb een aantal dingen geprobeerd die voor mij hebben gewerkt en andere waarvan ik hoop dat ze anderen niet zullen helpen.


Ik heb geen succes gehad:

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

Al het bovenstaande retourneerde een lege array voor mij


Ik had echter succes met hardlopen:

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

Dit leverde alle resultaten op in een array zoals ik had verwacht. Opmerking: je kunt de all()verwijderen en een Illuminate\Database\Eloquent\Collectionterugkrijgen in plaats van een array als je dat liever hebt.


Antwoord 6

in laravel 5.4deze code Model::whereNotNull('column')werkte niet, je moet get()op deze manier toevoegen een Model::whereNotNull('column')->get();deze werkt prima voor mij.


Antwoord 7

U kunt ook onbewerkte zoekopdrachten gebruiken.

Onthoud:Rapporten is mijn model en ik gebruik waar raw, het beste van de raw-query is dat je meerdere soorten operators kunt gebruiken, zoals AND, OR enz. tekenreeks.

Bijvoorbeeld: WHERE voorwaarde1 AND voorwaarde2 AND voorwaarde3 …;


Reports::whereRaw("column1 IS NOT NULL AND column2 IS NOT NULL");

De bovenstaande query wordt uitgevoerd als:

Selecteer * uit rapporten waar kolom NIET NULL IS EN kolom2 NIET NULL IS.

Voor meer begrip van de operators IS Nullen IS not null:

https://www.w3schools.com/sql/sql_and_or.asp


Antwoord 8

Als u verwijderde records wilt zoeken (Soft Deleted Record), gebruik dan geen Eloquent Model Query.

Gebruik in plaats daarvan de Db::table-query. Bijv.:

In plaats van:

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

Gebruik:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();

Other episodes