使用CakePHP中的PatchEntity从关联表中删除记录

时间:2017-07-25 05:05:20

标签: cakephp orm associations cakephp-3.0

我有一个CakePHP模型,其中一个Job有很多员工,一个Employee属于一个Job。我用来编辑Jobs和Employees的View是一个Job视图。这是我的工作控制器的代码:

   $job = $this->Jobs->get($id, [
        'contain' => ['Employees']
    ]);

    if ($this->request->is(['patch', 'post', 'put'])) {
        $req = $this->request->data;
        $job = $this->Jobs->patchEntity($job, $req, [
            'validate' => false,
            'associated' => ['Employees']
        ]);
        $saveResult = $this->Jobs->save($job, [
            'validate' => false,
            'associated' => ['Employees']
        ]);

$ this-> request->数据如下所示:

'employees' =>[
      0 => [
        'id' => 1,
         ... etc ...

当我添加员工时,$ this-> request->数据包含更多数组元素,补丁会将新记录添加到employees表中。

当我删除员工时,$ this-> request->数据包含更少的数组元素。但补丁不会删除任何记录。 (当数据返回时,我正在使用array_values修复数组排序)。

当请求中的记录较少时,有没有办法让补丁删除记录?

如果没有,删除的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

我不知道我是否完全得到你的问题/想要的结果,但是从你的行

  

有没有办法可以让补丁删除记录   请求中的记录更少?

我读了它,因为你想用当前邮政请求中的新关联数据替换“旧”关联数据。

hasMany关联的默认值为'saveStrategy' => 'append'https://api.cakephp.org/3.4/source-class-Cake.ORM.Association.HasMany.html#84-89)。 (自3.1版以来我认为)

您可以将saveStrategy更改为replace,如:

$this->hasMany('Employees', [
    'className' => 'Employees',
    'foreignKey' => 'employee_id',
    'saveStrategy' => 'replace'
]);

saveStrategy设置为replace时,只有当前帖子/ patchEntity中的关联数据会在保存时与当前模型记录关联。现有链接关联数据的外键将设置为空。