使用给定的uuid保存记录

时间:2015-07-09 09:28:04

标签: cakephp uuid cakephp-3.0

我想用给定的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?以及如何防止它

1 个答案:

答案 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