2014-02-05 50 views
0

我是CakePhp的新手,目前嘗試使用Tickets,Events,Tasks,Users等實現一個簡單的票證系統。在一個基本的CRUD功能之下,一個Ticket的狀態已經通過ajax調用完成,應該生成一個新的Ticket(代表工作流中的下一步)。CakePhp ::創建/插入查詢時缺少字段

然而,下一票號的Ticket::afterSave()通過AJAX創建回調至$this->saveField()最終失敗,並完整性約束違約,而「正常出爐的」 edit()通話作品。 蛋糕只是似乎忽略$this->save()生成的 MySQL INSERT INTO語句一些待保存的字段,我不能拿出解釋。

這裏票務的模型......

<? class Ticket extends AppModel { 

    // [...] 

    public function update($status) { 

     return $this->saveField('status', $status); 
    } 

    public function afterSave($created, $options = array()) { 

     //[...] if ticket state was changed to done: 

     // generate data for Ticket with next Task in Workflow 
     $this->Event->id = $this->field('event_id'); 
     $ticketData = $this->Event->generateNext(); 

     // check if data is correct 
     debug($ticketData); 

     // create new ticket 
     $this->create(); 

     return $this->save($ticketData); 

    } 
} 

完成票的Ticketbelongs_toUserTaskEvent事件產生下一票號的數據Event->generateNext()(與LinkableBehavior的幫助下,因爲遏制似乎不支持深層條件)。該數據是正確的,調試上述總是打印,如:

array(

    'Ticket' => array(
     'event_id' => '11720', 
     'task_id' => '9', 
     'user_id' => '1', 
     'status' => 'Requested') 
    ) 

然而,當Ajax的調用update功能,創建失敗:

Error: [...] Integrity constraint violation: Cannot add or update a child row: a foreign key constraint fails (`table`.`tickets`, CONSTRAINT `fk_tickets_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) [...]) 

...顯示SQL查詢:

'INSERT INTO `table`.`tickets` (`status`, `modified`, `created`) VALUES ('Requested', '2014-02-05 22:00:32', '2014-02-05 22:00:32')' 

正如你可以看到生成的查詢未命中user_id的領域等全部,其中當然會導致創作失敗。但調試證明了它們的存在?!混亂。 當調用在烤edit功能Ticket::save()但是查詢原來很好的,如:

'INSERT INTO `table`.`tickets` (`status`, `event_id`, `task_id`, `user_id`, `modified`, `created`) VALUES ('Requested', 11720, 9, 1, '2014-02-05 20:34:25', '2014-02-05 20:34:25')' 

我想我可以通過使用像Ticket->query()自定義查詢避免這種情況?但我寧願理解不同的結果,並以'蛋糕的方式'來做。 我希望這是某種可以理解的,真的很感謝任何幫助。

很多,很多預先感謝!

回答

0

由於您在狀態字段的初始更新後,從Ticket本身的afterSave()方法內創建新的故障單,因此該型號的白名單設置爲您最初保存(狀態)的唯一字段。 所有其他字段被

$this->save($ticketData); 

變化棄去到:

$this->save($ticketData, false, array(
    'event_id', 
    'task_id', 
    'user_id', 
    'status' 
); 

當心遞歸調用afterSave()。上面的調用$ this-> afterSave()將在afterSave()本身之後再次調用。

+0

非常感謝,saveario!你的解決方案就像一個魅力。 突然間,我的困惑感覺真的很愚蠢。我會立刻挖掘蛋糕的白名單。還要感謝提及遞歸調用,我認爲只要下一張票沒有標記爲「完成」,它應該沒問題。 – Shouji

+0

不客氣。我在幾個小時前就偶然發現了這一點。 – savedario