CakePHP 1.3 未保存到数据库但 sql 语句正确且 insertID 正确增加

Posted

技术标签:

【中文标题】CakePHP 1.3 未保存到数据库但 sql 语句正确且 insertID 正确增加【英文标题】:CakePHP 1.3 not saving to database but sql statement is correct and insertID is increased correctly 【发布时间】:2013-09-30 11:35:05 【问题描述】:

我已经在许多论坛中搜索了我真正奇怪的问题,但我仍然无法弄清楚我的保存过程中出了什么问题...问题:Cake 说,我的数据已保存,创建了一个自动增量 ID,但没有记录存储在数据库中。

环境

我有一个 cake-1.3.13 应用程序运行了一段时间,现在需要添加另一个数据库表,这当然与其他表相关。我的问题是保存 habtm-relation 表的记录,如下所示:

    CREATE TABLE IF NOT EXISTS `employees_projects_rejectreasons` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `employees_project_id` int(10) unsigned NOT NULL,
  `rejectreason_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `employees_project_id` (`employees_project_id`,`rejectreason_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6;

我只用基本的验证标准搭建了简单模型。

<?php
class EmployeesProjectsRejectreason extends AppModel 
var $name = 'EmployeesProjectsRejectreason';

var $validate = array(
    'employees_project_id' => array(
        'numeric' => array(
            'rule' => array('numeric'),
            //'message' => 'Your custom message here',
            //'allowEmpty' => false,
            //'required' => false,
            //'last' => false, // Stop validation after this rule
            //'on' => 'create', // Limit validation to 'create' or 'update' operations
        ),
    ),
    'rejectreason_id' => array(
        'numeric' => array(
            'rule' => array('numeric'),
            //'message' => 'Your custom message here',
            //'allowEmpty' => false,
            //'required' => false,
            //'last' => false, // Stop validation after this rule
            //'on' => 'create', // Limit validation to 'create' or 'update' operations
        ),
    ),
);


//The Associations below have been created with all possible keys, those that are not needed can be removed

var $belongsTo = array(
    'EmployeesProject' => array(
        'className' => 'EmployeesProject',
        'foreignKey' => 'employees_project_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Rejectreason' => array(
        'className' => 'Rejectreason',
        'foreignKey' => 'rejectreason_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

我为 Rejectreasons 和EmployeesProjects 创建了几条记录,所以我在数据库中有一些有效的条目。现在我想通过在给定的employees_projects_rejectreasons 表中创建一条新记录来将它们链接在一起。我尝试从另一个控制器(EmployeesProjectsController)执行此操作。这是我保存数据的最新尝试:

$this->EmployeesProject->EmployeesProjectsRejectreason->create();

$eprData = array(
    'EmployeesProjectsRejectreason' => array(
        'employees_project_id' => (int)$id,
        'rejectreason_id' => (int)$rrId
    )
);
if($this->EmployeesProject->EmployeesProjectsRejectreason->save($eprData)) 
    debug('successfully saved EPR with ID '.$this->EmployeesProject->EmployeesProjectsRejectreason->__insertID);
 else 
    debug('could not save EPR with employees_project_id='.$id.' and rejectreason_id='.$rrId);

现在会发生什么

在我尝试保存记录后,我的调试向我提供了以下成功报告:

successfully saved EPR with ID 4

所以 save() 调用返回 true,mysql 的 auto_increment 函数创建了一个新 ID。到现在为止还挺好。但是当我检查我的数据库时,没有创建记录。但是 auto_increment_counter 增加了 1,就好像存储了一条记录,但事实并非如此。

使用调试级别 2 运行应用程序,我可以看到从 cake 生成的 SQL 语句,这对我来说看起来非常好:

INSERT INTO `employees_projects_rejectreasons` (`employees_project_id`, `rejectreason_id`) VALUES (3, 3)

如果我直接在sql server上运行这条语句,记录插入正确。

我已经尝试过的

我已经尝试了保存过程的不同方法。我尝试使用 setter 而不是数据数组:

$this->EmployeesProject->EmployeesProjectsRejectreason->set('employees_project_id', $id);

也一样,但没有区别。在我在 EmployeesProjectsRejectreason-Model 中编写了一个自定义保存方法后,从控制器调用它,但它总是产生相同的结果。

我试过了

删除模型缓存 重新启动服务器实例和服务器本身 删除表并重新创建 在模型中禁用验证 删除唯一外键索引 使用硬编码和现有 ID 作为外键保存

一些更奇怪的行为

最后一次在我的控制器代码中使用硬编码 ID 的测试给我带来了更多的谜团:如果我尝试存储现有的 foreign_key-ID,则数据不会像以前那样保存。但是,如果两个 ID 都是硬编码且不存在(我使用了发明的 ID 345 和 567,它们在数据库中肯定不存在),则最终插入了一条记录!

此外,我为新表搭建了模型、视图和控制器。当我运行脚手架视图“myApp/employees_projects_rejectreasons/add”并添加新记录时,一切正常。

我只是无法保存其他控制器的记录。由于我已经非常头疼,解决这个问题,我非常感谢任何解决方案的提示!

提前谢谢各位!

【问题讨论】:

尝试在EmployeesProject控制器内的$uses数组中包含EmployeesProjectsRejectreason,然后直接使用$this-&gt;EmployeesProjectsRejectreason-&gt;save($eprData)。这行得通吗? 嗨@Yoggi,感谢您的回复!我没有使用 $uses 数组,因为我通常使用 可包含行为。所以我在我的代码中添加了这一行:var $uses = array('EmployeesProject', 'EmployeesProjectsRejectreason'); 但遗憾的是结果保持不变。 您还删除了EmployeesProject并使用了$this-&gt;EmployeesProjectsRejectreason-&gt;save($eprData)? 哦,对不起,第一次没有得到那个。我刚刚通过更改行尝试了它:$this-&gt;EmployeesProjectsRejectreason-&gt;create();if($this-&gt;EmployeesProjectsRejectreason-&gt;save($eprData)) debug('successfully saved EPR with ID '.$this-&gt;EmployeesProjectsRejectreason-&gt;__insertID); 但是,数据仍然没有保存到我的数据库中...... 尝试将一些执行相同操作的原始 SQL 放在同一个地方并使用它,也许这有助于查明问题。你可以使用$db = ConnectionManager::getInstance(); $conn = $db-&gt;getDataSource('default'); $conn-&gt;rawQuery($sql_string); 【参考方案1】:

我终于找到了解决问题的方法。我仍然不知道,为什么之前的保存代码不起作用,但这是我更改代码以使其起作用的方法:

在我的表单中,数据数组的格式如下:

Array
(
    [EmployeesProject] => Array
        (
            [id] => 10
            [user_id] => 0
            [additional_information] => some comment text
            [state] => absage
            [Rejectreason] => Array
                (
                    [0] => 1
                    [1] => 8
                )

        )
)

我搜索了一些解决方案,可以通过一个调用直接在 cakePHP 中保存 habtm 关系,但这在 cake-1.3 中似乎是不可能的。所以我在我的 EmployeesProjectController 中创建了这个非常简单的保存例程,它对我来说非常好用:

if (!empty($this->data)) 
            if ($this->EmployeesProject->save($this->data)) 
                if(array_key_exists('Rejectreason', $this->data['EmployeesProject'])) 
                    foreach($this->data['EmployeesProject']['Rejectreason'] as $key => $rrId) 
                        $this->EmployeesProject->EmployeesProjectsRejectreason->create();
                        $this->EmployeesProject->EmployeesProjectsRejectreason->set('rejectreason_id', $rrId);
                        $this->EmployeesProject->EmployeesProjectsRejectreason->set('employees_project_id', $this->data['EmployeesProject']['id']);
                        if($this->EmployeesProject->EmployeesProjectsRejectreason->save()) 

                        
                    
                
            
        

感谢@Yoggi 支持我解决这个问题!

【讨论】:

以上是关于CakePHP 1.3 未保存到数据库但 sql 语句正确且 insertID 正确增加的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 1.3 - 保存不相关模型的事务

未使用 CakePHP 保存关系 hasMany 关系

数据未保存在数据库 cakephp 中

使用 CakePHP 1.3 将图像上传到服务器

Cakephp - 条件保存

如何使用 CakePhp 克隆/复制 sql 记录?