代码之家  ›  专栏  ›  技术社区  ›  Steven Smethurst

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

  •  5
  • Steven Smethurst  · 技术社区  · 15 年前

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

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

    当我设定 Configure::write('debug', 2); core.php 并检查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 回复  |  直到 8 年前
        1
  •  15
  •   James Booker    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->型号->设置('attributeName',value)而不是$this->型号->属性名称

        2
  •  -1
  •   Steven Smethurst    15 年前

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

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

    我在这页上找到了这个解决方案 15 essential CakePHP tips