Cakephp保存到一个主键不是'id'的表中

5

我有一个现有的Web应用程序,正在转换为使用CakePHP。问题是,大多数表的主键都采用"${table_name}_id"(story_id)格式,而不是CakePHP的'id'。

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

当我在core.php中设置Configure::write('debug', 2);并检查SQL语句时,我看不到任何UPDATE命令,只有SELECT语句。

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

$this->Story->id = $this->data['Story']['story_id'] ; 

我已经没什么创意了,有什么建议吗?

下面是我使用的源代码:

故事控制器:

 function admin_edit($id = null) 
 {
  if (!$id && empty($this->data)) {
   $this->Session->setFlash(__('Invalid '. Configure::read('Site.media') , true));
   $this->redirect(array('action'=>'index'));
  }

  $this->layout = 'admin';  
  if (!empty($this->data)) {
   if ($this->Story->save($this->data)) {
    $this->Session->setFlash(__('The '. Configure::read('Site.media') .' has been saved', true));
   } else {
    $this->Session->setFlash(__('The '. Configure::read('Site.media') .' could not be saved. Please, try again.', true));
   }
  }

  $this->data = $this->Story->read(null, $id );
 }

故事模型:
class Story extends AppModel {
    var $name = 'Story';
    var $primaryKey = 'story_id';

    var $validate   = array(
       'author_id'  => array('numeric'),       
       'title'   => array('notempty'),
       'story'   => array('notempty'),
       'genra'   => array('notempty'),
       'form'    => array('notempty'),  
       'wordcount'  => array('Please enter a number between 1 and 1000' => array( 
              'rule'   => array('range', 1, 1001),
              'message'  => 'Please enter a number between 1 and 1000' ),
              'Required'  => array( 'rule' => 'numeric', 'required' => true )
            )
    );

    //The Associations below have been created with all possible keys, those that are not needed can be removed
    var $belongsTo = array(
     'Author' => array(
      'className' => 'Author',
      'foreignKey' => 'author_id'
     )
    );

    var $hasMany = array(
     'UserNote' => array(
      'className' => 'UserNote',
      'foreignKey' => 'story_id',
      'dependent' => false,
      'conditions' => 'UserNote.notes != ""'
     )
    );
}

故事视图:
    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 ;
2个回答

15

你应该在模型中手动覆盖主键字段(这是正确的地方,因为主键字段的名称是模型的属性,而不是应该在控制器中改变的内容。)

class Example extends AppModel {    var $primaryKey = 'example_id'; // example_id is the field name in the database}

以上代码来自http://book.cakephp.org/view/437/primaryKey

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

最后,如果你在控制器中设置模型变量,应该使用$this->Model->set('attributeName',value),而不是$this->Model->attributeName。


当联接表的主键不同时,您该如何处理? - J Lee
这个很好用,但这是正确的方法吗?这会干扰CakePHP中的一些AutoMagick功能吗? - Christian Strang

-1

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

$this->Story->validate = array(); // Stop valadation on the story.

我在这个页面上找到了这个解决方案15个必备的CakePHP技巧


1
这是一个糟糕的自我回答。作者禁用了警告,而不是真正解决问题。正确的答案是James Booker的答案。 - howrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接