2009-11-19 19 views
5

Tôi có một ứng dụng web hiện có mà tôi đang chuyển đổi để sử dụng CakePHP. Vấn đề là các khóa chính cho hầu hết các bảng có định dạng này "$ {table_name} _id" (story_id) thay vì cách CakePHP của 'id'CakePHP Lưu với một bảng mà khóa chính không phải là 'id'

Khi nào tôi cố gắng cập nhật một số trường đối với một hàng trong bảng câu chuyện, hàm Save() sẽ trả về false. Có cách nào để nhận được báo cáo lỗi chi tiết hơn từ hàm Save() không. ?

Khi tôi đặt Configure::write('debug', 2); trong core.php và kiểm tra câu lệnh SQL Tôi không thấy bất kỳ lệnh UPDATE nào, chỉ có câu lệnh SELECT.

Tôi đã cố chỉnh sửa bộ điều khiển thêm dòng sau để đặt thủ công trường id cho bộ điều khiển nhưng không giúp được.

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

Tôi đang hết ý tưởng. Bất kỳ đề xuất?

Tôi đã bao gồm mã nguồn mà tôi đang sử dụng dưới điều khiển

Story: mô hình

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:

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

Câu chuyện xem:

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

bảng câu chuyện

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 ; 

Trả lời

14

Bạn nên override bằng tay các trường tiểu học trọng trong mô hình (đó là nơi thích hợp để làm điều này - tên của một trường khóa chính là một thuộc tính của mô hình, chứ không phải cái gì đó nên được 'fudged' xung quanh trong bộ điều khiển.)

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

Đoạn mã trên là từ http://book.cakephp.org/view/437/primaryKey

Mặc dù đề xuất tắt tính năng xác thực sẽ hoạt động nhưng đó không phải là cách phù hợp để thực hiện.

Cuối cùng, nếu bạn đang thiết lập các biến mô hình trong một bộ điều khiển, bạn sử dụng $ this-> Model-> set ('AttributeName', giá trị) chứ không phải là $ this-> Model-> AttributeName

+0

Làm cách nào để bạn thực hiện việc này khi Khóa chính khác trên Bảng tham gia? –

+0

@fewpeople đưa ra ví dụ? –

+0

hoạt động tốt, mặc dù đây có phải là phương pháp phù hợp không? Điều này có thể can thiệp vào một số chức năng AutoMagick từ CakePHP không? –

0

Dường như bộ điều khiển câu chuyện đã được chứng thực dữ liệu, và các dữ liệu không hợp lệ. Thêm dòng sau vào bộ điều khiển sẽ ngừng xác thực dữ liệu.

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

tôi tìm thấy giải pháp này trên trang này 15 essential CakePHP tips

+1

Đây là một xấu tự trả lời. Tác giả đang tắt cảnh báo, thay vì thực sự khắc phục sự cố. Câu trả lời đúng là câu trả lời của James Booker. – howrad

Các vấn đề liên quan