Як ви перевіряєте красномовний "якщо не нульовий"?


218

Як перевірити, чи поле не красне з красномовним?

Я спробував, 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

Ви можете спробувати використовувати !=замість НЕ.
JaTochNietDan

1
@JaTochNietDan Оператор! = Не працює зі значеннями NULL. Згідно з документацією на MySQL : "Ви не можете використовувати арифметичні оператори порівняння, такі як =, <або <> для тестування на NULL."
Soulriser

Відповіді:


402

Красномовний має для цього метод (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

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. Я думаю, ситуація змінилася. Хоча основна документація Ларавеля все ще не дуже повна, вона більше схожа на купу путівників.
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'означає?
відправлений

1
Насправді тут 'і' нічого не робить, але це зробило б, якщо першим параметром буде масив. Ось прототип методу: 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.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 замість масиву.


0

в laravel 5.4 цей код Model::whereNotNull('column')не працює, вам потрібно додати, get()як цей, Model::whereNotNull('column')->get();цей для мене добре працює.


-11

Якщо ви хочете шукати видалену запис (Soft Deleted Record), не користуйтеся красномовним запитом моделі. Замість цього використовуйте запит 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.