Торт 3: столбец типа JSON хранит NULL в виде строки "null"
Моя модель определяется следующим образом:
<?php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Database\Schema\Table as Schema;
class AppLogsTable extends Table
{
protected function _initializeSchema(Schema $schema) {
$schema->columnType('data', 'json');
return $schema;
}
}
Формат JSON правильно применяется при сохранении в базе данных и при получении данных. Однако, если я установлю $appLog->data = null
и сохранить его через $this->appLogs->save($appLog)
это спасло бы строку null
в базу данных, а не реальное значение NULL. Колум data
в app_logs
таблица настроена на принятие нулей.
Если я раскомментирую определение типа столбца, он будет правильно хранить нули.
Как сохранить автоматический тип данных JSON и правильно сохранить NULL из модели?
1 ответ
Вам придется использовать пользовательский / расширенный класс типа базы данных, который обрабатывает null
значения соответственно, встроенный пропустит все через json_encode()
не важно что.
Что-то вроде этого:
// src/Database/Type/NullAwareJsonType.php
namespace App\Database\Type;
use Cake\Database\Driver;
use Cake\Database\Type\JsonType;
class NullAwareJsonType extends JsonType
{
public function toDatabase($value, Driver $driver)
{
if ($value === null) {
return null;
}
return parent::toDatabase($value, $driver);
}
}
Затем вы можете переопределить встроенный json
тип:
// config/bootstrap.php
\Cake\Database\Type::map('json', \App\Database\Type\NullAwareJsonType::class);
или сопоставьте его как новый тип и установите тип столбца соответственно:
\Cake\Database\Type::map('nullAwareJson', \App\Database\Type\NullAwareJsonType::class);
$schema->columnType('data', 'nullAwareJson');
Смотрите также