我想用给定的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'
],
那么为什么蛋糕会为我生成一个新的uuid?以及如何防止它
答案 0 :(得分:1)
这不起作用,因为在插入操作之前无条件地生成主键,请参阅
<强> https://github.com/cakephp/cakephp/blob/3.0.0/src/ORM/Table.php#L1486-L1490 强>
_newId()
目前,UUID类型是唯一实现生成ID的类型,因此提供自定义ID可以与其他类型一起使用。
您可以通过例如覆盖表中的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;
}
,这有效地导致现有主键不会被覆盖。
from var0 in ctx.B
join var1 in ctx.S on var0.B_id equals var1.parentId into var1Group
from var1 in var1Group
join var2 in ctx.M on var1.S_id equals var2.parentId