使用给定的 uuid 保存记录
Saving records with a given uuid
我想用给定的 uuid 在我的数据库中保存一堆静态记录,这是为了测试目的,以便在每个系统上应用程序都以完全相同的数据集开始。
当使用 SQL 插入时,这没问题,但我想使用 CakePHP 方式(为此我使用了一个迁移文件,但这并不重要)。
问题是我给蛋糕一个这样的数据数组并保存:
$data = [
['id' => '5cedf79a-e4b9-f235-3d4d-9fbeef41c7e8', 'name' => 'test'],
['id' => 'c2bf879c-072c-51a4-83d8-edbf2d97e07e', 'name' => 'test2']
];
$table = TableRegistry::get('My_Model');
$entities = $table->newEntities($data, [
'accessibleFields' => ['*' => true],
'validate' => false
]);
array_map([$table, 'save'], $entities );
一切都保存了,但是我所有的项目都被赋予了不同的uuid,如果我在保存后调试一条记录,它会显示实体中的原始uuid
'new' => false,
'accessible' => [
'*' => true
],
'properties' => [
'id' => '6b4524a8-4698-4297-84e5-5160f42f663b',
'name' => 'test',
],
'dirty' => [],
'original' => [
'id' => '5cedf79a-e4b9-f235-3d4d-9fbeef41c7e8'
],
那么为什么cake会为我生成一个新的uuid呢?我该如何预防
这不起作用,因为主键是在插入操作之前无条件生成的,请参阅
https://github.com/cakephp/cakephp/blob/3.0.0/src/ORM/Table.php#L1486-L1490
// ...
$id = (array)$this->_newId($primary) + $keys;
$primary = array_combine($primary, $id);
$filteredKeys = array_filter($primary, 'strlen');
$data = $filteredKeys + $data;
// ...
$statement = $this->query()->insert(array_keys($data))
->values($data)
->execute();
// ...
目前 UUID 类型是唯一实现生成 ID 的类型,因此提供自定义 ID 可以与其他类型一起使用。
您可以解决此问题,例如覆盖 table 中的 _newId()
方法,使其 returns null
,这会有效地导致现有主键不正在被覆盖。
protected function _newId($primary)
{
// maybe add some conditional logic here
// in case you don't want to be required
// to always manually provide a primary
// key for your insert operations
return null;
}
我想用给定的 uuid 在我的数据库中保存一堆静态记录,这是为了测试目的,以便在每个系统上应用程序都以完全相同的数据集开始。
当使用 SQL 插入时,这没问题,但我想使用 CakePHP 方式(为此我使用了一个迁移文件,但这并不重要)。
问题是我给蛋糕一个这样的数据数组并保存:
$data = [
['id' => '5cedf79a-e4b9-f235-3d4d-9fbeef41c7e8', 'name' => 'test'],
['id' => 'c2bf879c-072c-51a4-83d8-edbf2d97e07e', 'name' => 'test2']
];
$table = TableRegistry::get('My_Model');
$entities = $table->newEntities($data, [
'accessibleFields' => ['*' => true],
'validate' => false
]);
array_map([$table, 'save'], $entities );
一切都保存了,但是我所有的项目都被赋予了不同的uuid,如果我在保存后调试一条记录,它会显示实体中的原始uuid
'new' => false,
'accessible' => [
'*' => true
],
'properties' => [
'id' => '6b4524a8-4698-4297-84e5-5160f42f663b',
'name' => 'test',
],
'dirty' => [],
'original' => [
'id' => '5cedf79a-e4b9-f235-3d4d-9fbeef41c7e8'
],
那么为什么cake会为我生成一个新的uuid呢?我该如何预防
这不起作用,因为主键是在插入操作之前无条件生成的,请参阅
https://github.com/cakephp/cakephp/blob/3.0.0/src/ORM/Table.php#L1486-L1490
// ... $id = (array)$this->_newId($primary) + $keys; $primary = array_combine($primary, $id); $filteredKeys = array_filter($primary, 'strlen'); $data = $filteredKeys + $data; // ... $statement = $this->query()->insert(array_keys($data)) ->values($data) ->execute(); // ...
目前 UUID 类型是唯一实现生成 ID 的类型,因此提供自定义 ID 可以与其他类型一起使用。
您可以解决此问题,例如覆盖 table 中的 _newId()
方法,使其 returns null
,这会有效地导致现有主键不正在被覆盖。
protected function _newId($primary)
{
// maybe add some conditional logic here
// in case you don't want to be required
// to always manually provide a primary
// key for your insert operations
return null;
}