4

我的模型定义如下:

<?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 ?

4

1 回答 1

3

您必须使用一个自定义/扩展的数据库类型类来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');

也可以看看

于 2017-10-20T15:18:29.780 回答