使用主键不是'id'的表保存Cakephp

使用主键不是'id'的表保存Cakephp,php,cakephp,Php,Cakephp,我有一个正在转换为使用CakePHP的现有web应用程序。 问题是大多数表的主键都是${table\u name}\u id story\u id格式,而不是以CakePHP的方式“id” 当我试图更新故事表中某一行的某些字段时,Save函数将返回false。有没有办法从Save函数获取更详细的错误报告 当我设置Configure::write'debug',2;在core.php中检查SQL语句,我没有看到任何更新命令,只有SELECT语句 我试图编辑控制器,添加以下行以手动设置控制器的id字

我有一个正在转换为使用CakePHP的现有web应用程序。 问题是大多数表的主键都是${table\u name}\u id story\u id格式,而不是以CakePHP的方式“id”

当我试图更新故事表中某一行的某些字段时,Save函数将返回false。有没有办法从Save函数获取更详细的错误报告

当我设置Configure::write'debug',2;在core.php中检查SQL语句,我没有看到任何更新命令,只有SELECT语句

我试图编辑控制器,添加以下行以手动设置控制器的id字段,但没有帮助

$this->Story->id = $this->data['Story']['story_id'] ; 
我的点子快用完了。有什么建议吗

我在下面包含了我正在使用的源代码

故事控制器:

故事模型:

故事视图:

故事表


看起来故事控制器正在验证数据,但数据无效。 将以下行添加到控制器将停止数据验证

$this->Story->validate = array(); // Stop valadation on the story.
我在这页上找到了这个解决方案

您应该手动覆盖模型中的主键字段,这是执行此操作的正确位置-主键字段的名称是模型的一个属性,而不是控制器中应该“捏造”的内容

class Example extends AppModel {    var $primaryKey = 'example_id'; // example_id is the field name in the database}
以上代码来自

虽然关闭验证的建议会起作用,但这不是正确的方法


最后,如果要在控制器中设置模型变量,请使用$this->model->set'attributeName',value而不是$this->model->attributeName

当连接表上的主键不同时,如何执行此操作?这非常有效,但这是正确的方法吗?这会干扰CakePHP的一些AutoMagick功能吗?这是一个糟糕的自我回答。作者正在禁用警告,而不是实际修复问题。正确答案是詹姆斯·布克的答案。
    echo $form->create('Story', array('action' => 'edit' ) );
    echo $form->input('story_id',array('type'=>'hidden') );
    echo $form->input('title');
    echo $form->input('story');
    echo $form->input('bio' );
    echo $form->end('Update story details');?>
CREATE TABLE IF NOT EXISTS `stories` (
  `story_id` int(11) NOT NULL AUTO_INCREMENT,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `closed` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `author_id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `story` text NOT NULL,
  `genra` varchar(255) NOT NULL,
  `form` varchar(128) DEFAULT NULL,
  `wordcount` varchar(255) NOT NULL,
  `terms` varchar(255) NOT NULL DEFAULT '0',
  `status` varchar(255) NOT NULL DEFAULT 'slush',
  `published` date NOT NULL,
  `payment` varchar(255) NOT NULL DEFAULT 'none',
  `paypal_address` varchar(255) NOT NULL,
  `resubmission` tinyint(1) NOT NULL DEFAULT '0',
  `bio` text NOT NULL,
  `password` varchar(255) NOT NULL DEFAULT 'yyggrrdd',
  `comments` text NOT NULL,
  PRIMARY KEY (`story_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10905 ;
$this->Story->validate = array(); // Stop valadation on the story.
class Example extends AppModel {    var $primaryKey = 'example_id'; // example_id is the field name in the database}