CakePHP 3 - patchEntities() 的表单数据格式

Rob*_*rto 3 forms orm cakephp cakephp-3.0

我的问题非常简单:表单数据应该如何(即名称键应该是什么样子)来使用patchEntities()?

我已阅读 Cookbook > Database Access & ORM > Saving Data > Converting Multiple Records,但它没有明确提及如何使用它。

这种结构适用于newEntities()

        $data = [
            '0' => ['field1' => '...', /* ... */],
            '1' => ['field1' => '...', /* ... */],
            '2' => ['field1' => '...', /* ... */]
        ];
Run Code Online (Sandbox Code Playgroud)

使用如下形式:

<?= $this->Form->input('0.field1', /* ... */) ?>
<?= $this->Form->input('1.field1', /* ... */) ?>
...
Run Code Online (Sandbox Code Playgroud)

但是,相同的结构但 with'id.field1'不会对patchEntities().

ndm*_*ndm 5

表单数据看起来应该相同,但它应该包含记录主键,以便编组器可以将数据映射到相应的记录上。表单输入中的前导数字不是主键 (id),而只是生成的数组索引。

文档也可以使用一些更新来包含patchEntities(),现在只有一小部分隐藏在“ Patching HasMany 和 BelongsToMany ”部分中。

Cookbook > 数据库访问和 ORM > 保存数据 > 修补 HasMany 和 BelongsToMany

所以表格应该是这样的:

<?= $this->Form->input('0.id', /* ... */) ?>
<?= $this->Form->input('0.field1', /* ... */) ?>
<?= $this->Form->input('1.id', /* ... */) ?>
<?= $this->Form->input('1.field1', /* ... */) ?>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)

产生一个数据集,如:

$data = [
    '0' => ['id' => '...', 'field1' => '...', /* ... */],
    '1' => ['id' => '...', 'field1' => '...', /* ... */],
    // ...
];
Run Code Online (Sandbox Code Playgroud)

然后可以在给定的实体上修补:

$original = $this->Table->find()->toArray();
$patched = $this->Table->patchEntities($original, $data);
Run Code Online (Sandbox Code Playgroud)