Eloquentで「nullでない場合」をどのようにチェックしますか?


218

Eloquentでフィールドがnullないかどうかをどのように確認しますか?

試しましたModel::where('sent_at', 'IS NOT', DB::raw('null'))->...IS NOT、比較ではなくバインディングとして表示されます。

これはそれについてDB::getQueryLog()言っていることです:

  '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

!=IS NOTの代わりに使用してみることができます。
JaTochNietDan 2014年

1
@JaTochNietDan!=演算子はNULL値では機能しません。MySQLのドキュメントによれば、「=、<、<>などの算術比較演算子を使用してNULLをテストすることはできません。」
Soulriser 2016年

回答:


402

Eloquentにはその方法があります(Laravel 4。* / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

1
削除されたフィールドでnullをチェックする必要があるので、これをに変更し whereNull('deleted_at')、クエリを実行しました。
Tarunn、2015年

7
文書化されていないもう1つの機能。まあ、あなたがAPIドキュメントを数えない限り、Laravelのメインのドキュメントはそれについて言及していません。
aros

12
whereNotNull()方法(及び以前に文書化されていないし、いくつかの他のもの)は、バージョン5.1のドキュメントに加えた:laravel.com/docs/5.1/queries#where-clauses
ベンジョンソン

@arossですが、Eloquent(Laravel 5.1)ではなく、Query Builderにあります
プミランダ

@pmirandaどういう意味かわかりませんが、私のコメントは4年前のLaravel 4に関するもので、今日はLaravel 6にいます。状況は変わったと思います。Laravelの主要なドキュメントはまだ完全ではありませんが、ガイドの束のように感じられます。
-aross

20

私のような誰かがLaravel 5.2.23のクエリビルダーでそれをしたいのであれば、それは->

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

またはモデルのスコープを使用:

public function scopeNotNullOnly($query){

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

1
何の'and'略ですか?
センティ2016

1
実際、ここでは「and」は何もしませんが、最初のパラメータが配列の場合はそうします。メソッドのプロトタイプは次のとおりです。public function where($column, $operator = null, $value = null, $boolean = 'and'); 場所–".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur


4

使用できます

Model::whereNotNull('sent_at');

または

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

4

この質問は少し古いですが、答えを探して偶然見つけました。ここでの答えには成功しませんでしたが、PHP 7.2Laravel 5.7を使用しているためと思われますまたは、Laravel Tinkerを使用してCLIでいくつかのデータをいじっていたために可能でした。

私が試したいくつかのことは私のために機能し、他のものは私が他の人を助けることを望んでいない。


私は実行に成功しませんでした:

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

上記のすべてが私のために空の配列を返しました


しかし、実行には成功しました。

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

これにより、期待どおりすべての結果が配列で返されました。注:必要に応じて、配列の代わりにをドロップしall()Illuminate \ Database \ Eloquent \ Collectionを取得できます。


0

laravel 5.4このコードはModel::whereNotNull('column')、あなたが追加する必要が働いていなかったget()この1のようにModel::whereNotNull('column')->get();この1つは私のために罰金を動作します。


-11

削除済みレコード(ソフト削除済みレコード)を検索する場合は、Eloquentモデルクエリを使用しないでください。代わりにDb :: tableクエリを使用してください。たとえば、以下を使用する代わりに:

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

使用する:

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

この答えは質問とは関係ありません。その上Db::table、一時的に削除されたレコードを見つけるためにを使用する必要はありません。あなたはwithTrashed()ドキュメントで言われているように、メソッドでそれらをフィルタリングすることができます:laravel.com/docs/5.3/eloquent
gvsrepins
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.