2009-11-19 3 views
5

Mam istniejącą aplikację internetową, którą konwertuję do korzystania z CakePHP. Problem polega na tym, że klucze podstawowe dla większości tabel są w tym formacie "$ {table_name} _id" (id_twaru) zamiast metody CakePHP 'id'Cakephp Zapisz przy użyciu tabeli, w której klucz podstawowy nie jest "id"

Kiedykolwiek próbuję zaktualizować niektóre z pól dla wiersza w tabeli opowieści funkcja Save() zwróci wartość false. Czy istnieje sposób uzyskania bardziej szczegółowego raportu o błędzie z funkcji Save(). ?

Po ustawieniu Configure::write('debug', 2); w core.php i sprawdzeniu instrukcji SQL nie widzę żadnej instrukcji UPDATE, tylko instrukcje SELECT.

Próbowałem edytować kontroler dodając następujący wiersz, aby ręcznie ustawić pole identyfikatora dla kontrolera, ale to nie pomogło.

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

Brakuje mi pomysłów. Jakieś sugestie?

mam włączone kod źródłowy, który używam poniżej kontrolera

Story: model

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

historia: widok

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

historia:

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

stół Story

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 ; 

Odpowiedz

14

Należy ręcznie zmienić pole klucza podstawowego w modelu (który jest właściwym miejscem, aby to zrobić - nazwa pola klucza podstawowego jest atrybut modelu, a nie coś, co powinno być „fudged” wokół w sterowniku.)

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

powyższy kod jest od http://book.cakephp.org/view/437/primaryKey

Podczas gdy sugestia wyłączenia sprawdzania poprawności będzie działać, nie jest to właściwa droga.

Wreszcie, jeśli ustawienie zmiennych w modelu sterownika, należy użyć $ this-> Model-> set ('attributeName', value) raczej niż $ this-> Model-> attributeName

+0

Jak to zrobić, gdy klucz podstawowy różni się w tabeli dołączania? –

+0

@fewpeople podać przykład? –

+0

działa to świetnie, ale czy to właściwe podejście? Czy może to kolidować z niektórymi funkcjami AutoMagick z CakePHP? –

0

Wygląda kontroler historia została walidacji danych, a dane były nieprawidłowe. Dodanie następującego wiersza do kontrolera zatrzyma sprawdzanie poprawności danych.

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

Znalazłem rozwiązanie na tej stronie 15 essential CakePHP tips

+1

Jest to złe samopoznanie. Autor wyłącza ostrzeżenie, zamiast naprawiać problem. Poprawną odpowiedzią jest odpowiedź Jamesa Bookera. – howrad

Powiązane problemy