Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP删除saveAll上的其他HABTM记录_Cakephp_Has And Belongs To Many - Fatal编程技术网

CakePHP删除saveAll上的其他HABTM记录

CakePHP删除saveAll上的其他HABTM记录,cakephp,has-and-belongs-to-many,Cakephp,Has And Belongs To Many,我有两个与HABTM相关的模型:缺席和用户。对于上下文,用户申请缺勤(相应地,用户别名为申请人,缺勤别名为缺勤申请)。我正在尝试为“apply”和“retract”创建控制器函数,这将分别添加一个HABTM记录和删除一个HABTM记录。我已经将代码保存到可以保存一条记录的程度,但不能保存更多。现在,我的“apply”控制器代码是硬编码的,用于添加两条记录,但它只添加最后一条请求的记录。这是我的控制器代码: function apply($id = null) { if (

我有两个与HABTM相关的模型:缺席和用户。对于上下文,用户申请缺勤(相应地,用户别名为申请人,缺勤别名为缺勤申请)。我正在尝试为“apply”和“retract”创建控制器函数,这将分别添加一个HABTM记录和删除一个HABTM记录。我已经将代码保存到可以保存一条记录的程度,但不能保存更多。现在,我的“apply”控制器代码是硬编码的,用于添加两条记录,但它只添加最后一条请求的记录。这是我的控制器代码:

function apply($id = null) {
            if (!$id) {
                    $this->Session->setFlash(__('Invalid id for absence', true));
                    $this->redirect(array('action'=>'index'));
            }

            $this->Absence->recursive = 1;
            $user = $this->Session->read('User');
            $absence = $this->Absence->read(null, $id);
            $data = array(
                    array(
                            'Applicant' => array('id' => 1),
                            'Absence' => array('id' => 4)
                    ),
                    array(
                            'Applicant' => array('id' => 2),
                            'Absence' => array('id' => 4)
                    )
            );

            //$data = array_unique($data);
            if ($this->Absence->saveAll($data)) {
                    $this->Session->setFlash('Application was successful');
            } else {
                    $this->Session->setFlash('Application failed');
            }
            $this->set(compact('data'));
    }
我可以看到$data中的两个条目都在调试查询中被处理,但由于某种原因,其中一个被删除了。有人知道为什么吗?以下是由该控制器代码运行的一些查询(请注意19、25和26):

我可以看到$data中的两个条目都在调试查询中被处理,但由于某种原因,其中一个被删除了。有人知道为什么吗

当然,因为这是蛋糕的默认行为

本节简要介绍了如何为联接表创建一个单独的模型,但我认为这并不能很好地解释这意味着什么或如何实现我不是建议这应该是你的方法,你应该研究信息并根据你的应用程序做出决定数据示意图很容易成为最重要的方面之一

我不熟悉RubyonRails,但本质上我们希望复制模型关联。简而言之,我们希望能够像使用任何其他模型一样使用HABTM
join

因此,我们将像这样设置新的模型关联

您的
缺勤
型号

class Absence extends AppModel {

    public $belongsTo = array('AbsentUser');
    ...
class User extends AppModel {
    public $belongsTo = array('AbsentUser');
    ...
class AbsentUser extends AppModel {
    public $hasMany = array('Absence', 'User');
    ...
您的
用户
型号

class Absence extends AppModel {

    public $belongsTo = array('AbsentUser');
    ...
class User extends AppModel {
    public $belongsTo = array('AbsentUser');
    ...
class AbsentUser extends AppModel {
    public $hasMany = array('Absence', 'User');
    ...
您的
缺席用户
型号

class Absence extends AppModel {

    public $belongsTo = array('AbsentUser');
    ...
class User extends AppModel {
    public $belongsTo = array('AbsentUser');
    ...
class AbsentUser extends AppModel {
    public $hasMany = array('Absence', 'User');
    ...
现在,您可以使用
AbsentUser
作为自己的模型,从而绕过Cake的默认HABTM行为。此外,如果您选择,它还允许您轻松扩展
AbsentUser
数据以合并其他字段。例如,您可以存储有关特定缺勤的特定信息

我也强烈建议你确保你有。如果你这样做了,你以后会爱上自己的

我可以看到$data中的两个条目都在调试查询中被处理,但由于某种原因,其中一个被删除了。有人知道为什么吗

当然,因为这是蛋糕的默认行为

本节简要介绍了如何为联接表创建一个单独的模型,但我认为这并不能很好地解释这意味着什么或如何实现我不是建议这应该是你的方法,你应该研究信息并根据你的应用程序做出决定数据示意图很容易成为最重要的方面之一

我不熟悉RubyonRails,但本质上我们希望复制模型关联。简而言之,我们希望能够像使用任何其他模型一样使用HABTM
join

因此,我们将像这样设置新的模型关联

您的
缺勤
型号

class Absence extends AppModel {

    public $belongsTo = array('AbsentUser');
    ...
class User extends AppModel {
    public $belongsTo = array('AbsentUser');
    ...
class AbsentUser extends AppModel {
    public $hasMany = array('Absence', 'User');
    ...
您的
用户
型号

class Absence extends AppModel {

    public $belongsTo = array('AbsentUser');
    ...
class User extends AppModel {
    public $belongsTo = array('AbsentUser');
    ...
class AbsentUser extends AppModel {
    public $hasMany = array('Absence', 'User');
    ...
您的
缺席用户
型号

class Absence extends AppModel {

    public $belongsTo = array('AbsentUser');
    ...
class User extends AppModel {
    public $belongsTo = array('AbsentUser');
    ...
class AbsentUser extends AppModel {
    public $hasMany = array('Absence', 'User');
    ...
现在,您可以使用
AbsentUser
作为自己的模型,从而绕过Cake的默认HABTM行为。此外,如果您选择,它还允许您轻松扩展
AbsentUser
数据以合并其他字段。例如,您可以存储有关特定缺勤的特定信息


我也强烈建议你确保你有。如果您这样做,您以后会爱上自己。

自2.1版以来,您现在可以将unique设置设置为keepExisting,以避免在保存操作期间丢失额外数据

 var $hasAndBelongsToMany = array(
        'User'  => array(
            'unique' => 'keepExisting',
            ),
    );

从2.1版开始,您现在可以将unique设置设置为keepExisting,以避免在保存操作期间丢失额外数据

 var $hasAndBelongsToMany = array(
        'User'  => array(
            'unique' => 'keepExisting',
            ),
    );

我已经看到了关于连接的单独模型的部分,但是没有把它放在一起,这是我所需要的。看起来是一个可靠的方法。谢谢谢谢如果这对你不起作用,请告诉我。我喜欢当我的答案真的解决了一些问题的时候。我看过关于连接的单独模型的部分,但是没有把它放在一起,这是我所需要的。看起来是一个可靠的方法。谢谢谢谢如果这对你不起作用,请告诉我。我喜欢我的答案能解决问题。