Как вы проверяете «если не ноль» с Eloquent?

218

Как проверить, не является ли поле пустым в Eloquent?

Я пытался, 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
Marwelln
источник
Вы можете попробовать использовать !=вместо НЕ.
JaTochNietDan
1
@JaTochNietDan Оператор! = Не работает со значениями NULL. Согласно документации MySQL : «Вы не можете использовать операторы арифметического сравнения, такие как =, <или <>, чтобы проверить на NULL».
Soulriser

Ответы:

402

У Eloquent есть метод для этого (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Ларавелла 3:

Model::where_not_null('sent_at')
Bas
источник
1
Мне нужно проверить нулевое значение в удаленном поле, поэтому я изменил это whereNull('deleted_at')и получил свой запрос.
Тарунн
7
Еще одна недокументированная особенность. Ну, если не считать документы по API, но в основной документации Laravel об этом ничего не говорится.
aross
12
Этот whereNotNull()метод (и некоторые другие, которые ранее не были документированы) были добавлены в документацию в версии 5.1: laravel.com/docs/5.1/queries#where-clauses .
Бен Джонсон
@aross, но в Query Builder, а не в Eloquent (Laravel 5.1)
pmiranda
@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', '<>', '');
}
Atiqur
источник
1
что 'and'означает?
Отправлено
1
На самом деле здесь 'и' ничего не делает, но будет, если первым параметром будет массив. Вот прототип метода: public function where($column, $operator = null, $value = null, $boolean = 'and'); и местоположение".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur
9

Если вы хотите использовать фасад БД :

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

Джон
источник
4

Мы можем использовать

Model::whereNotNull('sent_at');

Или

Model::whereRaw('sent_at is not null');
srmilon
источник
4

Я вижу, что этот вопрос немного стар, но я наткнулся на него в поисках ответа. Хотя у меня не было успеха с ответами здесь, я думаю, что это может быть, потому что я нахожусь на PHP 7.2 и Laravel 5.7. или возможно, потому что я просто играл с данными из CLI, используя Laravel Tinker.

У меня есть кое-какие вещи, которые я пробовал, которые сработали для меня, и другие, которые не помогли, надеюсь, помогут другим.


У меня не было успеха в беге:

    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 вместо массива, если хотите.

Rockin4Life33
источник
0

в laravel 5.4 этот код Model::whereNotNull('column')не работал, вам нужно добавить get()вот Model::whereNotNull('column')->get();этот, он отлично работает для меня.

Кардинг Эрмита Сунгкит
источник
-11

Если вы хотите найти удаленную запись (Soft Deleted Record), не используйте Eloquent Model Query. Вместо этого используйте запрос Db :: table, например, вместо использования ниже:

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

Использование:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();
user4397894
источник
Этот ответ не имеет ничего общего с вопросом. Кроме того, вам не нужно использовать его Db::tableдля поиска удаленных записей. Вы можете отфильтровать их с помощью метода withTrashed(), как сказано в документации: laravel.com/docs/5.3/eloquent
gvsrepins