Birincil anahtar 'id' değil nerede CakePHP'de bir tablo ile kaydetme

1 Cevap php

I have an existing web application that I am converting to use CakePHP. The problem is that the primary keys for most of the tables are in this format "${table_name}_id" (story_id) instead of the CakePHP way of 'id'

Ben hikaye tablosundaki bir satır için bazı alanları güncelleştirmeye çalıştığınızda, hiç Kaydet () fonksiyonu false dönecektir. Tasarrufundan daha ayrıntılı bir hata raporu () fonksiyonu almanın herhangi bir yolu var mı. ?

I core.php in Configure::write('debug', 2); set ve herhangi bir UPDATE komutu görmüyorum SQL ifadeleri kontrol ettiğinizde, sadece SELECT deyimleri.

Ben el denetleyicisi için id alanını ama yardımcı olmadı aşağıdaki satırı ekleyerek denetleyicisi düzenlemek için çalıştı.

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

Ben fikir tükeniyor. Herhangi bir öneriniz?

Ben aşağıda kullanıyorum kaynak kodu dahil ettik

Story controller:

 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 );
 }

Story model:

    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 != ""'
  )
 );
    }

Story view:

    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');?>

Story table

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 ;

1 Cevap

Elle (bunu yapmak için doğru yer olan - bir birincil anahtar alan adı denetleyicisi 'etrafında fudged' olması gereken bir şey değil modelinin bir nitelik olup.) Modelinde birincil anahtar alanını geçersiz kılar

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

Yukarıdaki kod http://book.cakephp.org/view/437/primaryKey dan

Doğrulama kapatmak için öneri çalışacak olsa da, bu konuda gitmek için doğru yol değil.

Eğer bir kontrol içinde model değişkenleri ayarlayarak eğer Son olarak, size $ this-> Model-> set ('attributeName', değer) yerine $ this-> Model-> attributeName kullanın