我是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);
}
}
完成票的Ticket
belongs_to
User
,Task
和Event
的事件產生下一票號的數據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()
自定義查詢避免這種情況?但我寧願理解不同的結果,並以'蛋糕的方式'來做。 我希望這是某種可以理解的,真的很感謝任何幫助。
很多,很多預先感謝!
非常感謝,saveario!你的解決方案就像一個魅力。 突然間,我的困惑感覺真的很愚蠢。我會立刻挖掘蛋糕的白名單。還要感謝提及遞歸調用,我認爲只要下一張票沒有標記爲「完成」,它應該沒問題。 – Shouji
不客氣。我在幾個小時前就偶然發現了這一點。 – savedario