我正在使用最新的CakePHP版本,并希望使用fixtures进行一些PHPunit测试。我的MariaDB版本不支持JSON数据类型,因此我将TEXT数据类型用于应存储json数据的表列。例如,我有一个名为 Items 的表,其中包含 json_options 列。我已将CakePHP的预定义自定义JSON数据类型包含在我的表模型中:
// in src/Model/Table/ItemsTable.php
protected function _initializeSchema(TableSchema $schema)
{
$schema->columnType('json_column', 'json');
return $schema;
}
现在我正在使用Bake控制台生成Fixtures并从表中导入一些记录:
bake fixture items -c fixture -r
(简化)结果是这样的:
// in /tests/Fixture/ItemsFixture.php
public $fields = [
'id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
'json_options' => ['type' => 'text', 'length' => null, 'null' => true, 'default' => null, 'collate' => 'utf8_general_ci', 'comment' => '', 'precision' => null],
public $records = [
'id' => 1
'options' => array(
'someKey' => 'someValue'
)
]
现在的问题是: json_options 列在$ fields-definition中的类型为 text ,但该记录包含数组而不是字符串。这在运行测试时会导致异常:
Exception: Cannot convert value to string in src\Database\Type\StringType.php
如果我将类型从文本更改为 json ,则测试正常。但是,在每次导入记录后,在所有表夹具中手动更改类型需要做很多工作。
那么Bake shell是否有可能在Fixture生成过程中检测到json列并使用正确的类型?或者有没有办法在Fixture中动态更改模式定义,例如在ItemsControllerTest.php的setUp()方法中?或任何其他提示如何处理Fixtures中的json数据?
答案 0 :(得分:0)
只需覆盖灯具的构造函数:
/**
* @inheritDoc
*/
public function __constructor() {
parent::__construct();
foreach ($this->records as &$record) {
$record['data'] = json_encode($record['data']);
}
}