Yii: читаем пустые значения как null
7 мая 2011
Для того, чтобы Yii читал пустые значения как null
, а не как пустую строку достаточно добавить один параметр в конфигурацию компонента db
:
'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=test', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'nullConversion' => PDO::NULL_EMPTY_STRING, ),
Комментарии RSS по email OK
А зачем?
Вероятно потому что null и "" это совсем разные значения... Согласись. Это может казаться не очевидным но ситуация вносящая ясность рано или поздно подвернется.
Ну так для пустого значения мне как раз более логичным кажется пустота, а не null :) А с неочевидностью беда, всё равно она останется в голове.
Невероятно важная штука. Раньше использовал для этого поведение. Берем на вооружение. Самое интересное, что эта возможность была всегда в CDbConnection. Не доглядел :(
Преимущество EEnsureNullBehavior в том что он работает не только для строк, но и для других типов, плюс работает не глобально а только в тех моделях, где он подключен.
Тормоз, тогда так:
У меня не работает (Windows + PHP 5.2)
mrix, что именно?
Как были пустые строки, так и остаются. В БД записывается "", а не NULL.
mrix, а поле в базе случаем не как
NOT NULL
объявлено?Нет, DEFAULT NULL. Проверял и на VARCHAR, и на TEXT:
Вот сохраняю модель с пустым полем "source" - записывается пустая строка:
Руками в БД могу выставить NULL:
mrix, хм, надо будет посмотреть в чём тут дело.
Оно в БД записывает, как указывается. А вот обратно в PHP возвращает NULL вместо пустых строк. Я думал, что и в БД пишется NULL. Так было бы лучше. Например, COUNT считал бы по-другому.
Вот код:
Возвращает:
А в БД лежит:
Забыл указать, что сделал этот пример не Yii. Простейшая "обёртка" PDO:
mrix, поправил.
есть же в модели такое
array('note', 'default', 'setOnEmpty' => true, 'value' => null),
работает стопудовоSam, спустя 2 года после твоего ответа столкнулся с такой же проблемой. Но не работает. Т.е. при сохранении пустой строки сохраняется пустая строка, но не NULL. Может быть тут - github.com/yiisoft/yii/blob/1.1.14/framework/db/schema/CDbColumnSchema.php#L138 - стоит делать проверку настроек соединения, и если стоит PDO::NULL_EMPTY_STRING, то возвращать для строки не пустую строку, но NULL ?
Всё работает, добавляешь в правило array('note', 'default', 'setOnEmpty' => true, 'value' => null) и всё работает!