ActiveRecord в yii2. Выборка по null

Пусть это будет первая статья из раздела hotpost. Быстрые, краткие, полезные статьи, которые пишутся на одном дыхании и сразу публикуются. По большей части, чтобы не забыть что-то и не искать опять.

Зачастую, при разработке, приходится доставать данные из бд по разным правилам, иногда, а вообще, довольно часто, это правило должно выглядеть как «не равняется null». Тут то и начинается шоу интуиция.

 Проблема тут одна, не всегда бд понимает null как null, то ли у меня одного такие проблемы, то ли звезды сошлись. Проблема решается второй ссылкой в google и довольно просто, тут я и опишу решение.

При использовании null в качестве аргумента правил выборки, для yii2, в частности для activeRecord, желательно использовать вспомогательный класс new \yii\db\Expression(). В конструктор он принимает выражение, которое не нуждается в экранировании или цитировании. Такими выражениями и есть наш null, а еще разные функции, по типу NOW(). Странные разработчики фреймворка осмелились описать это в документации.

 Expression represents a DB expression that does not need escaping or quoting.

  When an Expression object is embedded within a SQL statement or fragment, it will be replaced with the [[expression]] property value without any

  DB escaping or quoting. For example,

  $expression = new Expression('NOW()');

  $now = (new \yii\db\Query)->select($expression)->scalar();  // SELECT NOW();

  echo $now; // prints the current date

  Expression objects are mainly created for passing raw SQL expressions to methods of [[Query]], [[ActiveQuery]], and related classes.

 An expression can also be bound with parameters specified via [[params]].

 

Пример кода, который можно использовать для выборки:

Class::find()->where(['is', 'parameter', new \yii\db\Expression('null')]) ->all();

Нужно заметить, что мы не можем использовать операторы «=», «<>», они заменяются на «IS», «IS NOT», потому записать выражение удается только одно для метода where(). Что бы не громоздить массивы с AND и OR, можно использовать методы orWhere() или andWhere(), которые отлично вписываются в общую конструкцию.

Вот такая небольшая статья о том, как сделать выборку по null используя activeRecord в yii2.