Торт 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');

Смотрите также

Другие вопросы по тегам