使用主键不是'id'的表保存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字段,但没有帮助使用主键不是'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字
$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}