ChatGPT解决这个技术问题 Extra ChatGPT

How do you check "if not null" with Eloquent?

How do you check if a field is not null with Eloquent?

I tried Model::where('sent_at', 'IS NOT', DB::raw('null'))->... but it gives IS NOT as a binding instead of a comparison.

This is what DB::getQueryLog() says about it:

  '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
You could try using != instead of IS NOT.
@JaTochNietDan The != operator does not work with NULL values. Per the MySQL Documentation: "You cannot use arithmetic comparison operators such as =, <, or <> to test for NULL."

i
ishegg

Eloquent has a method for that (Laravel 4.*/5.*);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

I need to check the null at deleted field, so I changed this into whereNull('deleted_at') and I got my query running.
Another undocumented feature. Well, unless you count the API docs, but Laravel's main documentation makes no mention of it.
The whereNotNull() method (and several others that were undocumented previously) were added to the documentation in version 5.1: laravel.com/docs/5.1/queries#where-clauses .
@aross but in Query Builder, not in Eloquent (Laravel 5.1)
@pmiranda not sure what you mean, but my comment was 4 years ago and about Laravel 4, nowadays we're at Laravel 6. I guess the situation changed. Although Laravel's main documentation is still not very complete, it feels more like a bunch of guides.
A
Atiqur

If someone like me want to do it with query builder in Laravel 5.2.23 it can be done like ->

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

Or with scope in model :

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}

what does 'and' stands for?
Actually here 'and' does nothing but it would do if first parameter would be an array. Here is the method prototype : public function where($column, $operator = null, $value = null, $boolean = 'and'); and location - ".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
M
Md. Saidur Rahman Milon

We can use

Model::whereNotNull('sent_at');

Or

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

J
Jon

If you wanted to use the DB facade:

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


R
Rockin4Life33

I see this question is a bit old but I ran across it looking for an answer. Although I did not have success with the answers here I think this might be because I'm on PHP 7.2 and Laravel 5.7. or possible because I was just playing around with some data on the CLI using Laravel Tinker.

I have some things I tried that worked for me and others that did not that I hope will help others out.

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

All of the above returned an empty array for me

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

This returned all the results in an array as I expected. Note: you can drop the all() and get back a Illuminate\Database\Eloquent\Collection instead of an array if you prefer.


J
JON

in laravel 5.4 this code Model::whereNotNull('column') was not working you need to add get() like this one Model::whereNotNull('column')->get(); this one works fine for me.


S
Sabaoon Bedar

You can also use raw query.

Remember: Reports is my model and I am using where raw, the best thing of the raw query is that you can use multiple types of operators such as AND, OR etc just by passing as a string.

For example: WHERE condition1 AND condition2 AND condition3 ...;

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

The above query will be executed as:

Select * from reports where column IS NOT NULL AND column2 IS NOT NULL.

For more understanding of IS Null and IS not null operators:

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


t
tayeb320

You can do it by simply following:

Model::whereNotNull('sent_at')->get();

u
user16780927

If you want to search deleted record (Soft Deleted Record), do not use Eloquent Model Query.

Use the Db::table query instead. E.g.:

Instead of:

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

Use:

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

This answer has nothing to do with the question. Besides that, you don't necessary needs to use Db::table to find the soft deleted records. You could filter them with the method withTrashed(), like is told in the docs: laravel.com/docs/5.3/eloquent
This answer has nothing to do with the demanded question.