2012-06-01 94 views
2

我有兩個表 等之間的has_many關係:「問題」 - <「選項」 [一個問題有很多選擇] 我的階級結構是: 的問題刪除相關記錄,具有的has_many關係

class Model_Admin_sysQuestion extends ORM { 

protected $_table_name = 'questions'; 

protected $_has_many = array(
    'options' => array(
     'model' => 'Admin_sysQuestionOption', 
     'foreign_key' => 'question_id', 
    ), 
);... . 

的選項

Class Model_Admin_sysQuestionOption extends ORM { 

protected $_table_name = 'questions_options'; 
protected $_belongs_to = array(
    'question' => array(
     'model' => 'Admin_sysSection', 
     'foreign_key' => 'question_id', 
    ), 
); .... . 

和IM試圖刪除與下面的代碼的所有選項的問題:

$question = ORM::factory('Admin_sysQuestion', 30); 
     $question->options->delete($question->id); 
     $question->delete(); 

,但它給錯誤

錯誤 「:」 因爲它沒有加載無法刪除admin_sysquestionoption模式「

任何想法?怎麼做?

回答

4

當加載多重關係,你必須調用find_all

foreach($question->options->find_all() as $option) 
{ 
    $option->delete(); 
} 

或者使用DB QBuilder多個刪除:

DB::delete('questions_options') 
    ->where('question_id', '=', 30) 
    ->execute($this->_db); 
1

除了對@biakevoron你也有MySQL的選項後,只需在options表中添加on delete cascade要求的兩個表之間的關係即可。就我個人而言,我還檢查與當前對象關聯的對象/行,覆蓋顯式(刪除關係對象)作爲遊戲的隱式面。事實上,你應該能夠信任MySQL做它的工作(它很好),但如果有人即。改變關係,或者將表格切換到MyIsam,你可能不會注意到表格變得真的很大。

玩弄下表。它在選項表上強制嚴格的歸屬關係,這意味着選項只有存在父項時才能存在。

CREATE TABLE `options` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `question_id` int(10) unsigned NOT NULL, 
    `option` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 


CREATE TABLE `questions` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `question` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 


ALTER TABLE `options` 
    ADD CONSTRAINT `options_belongs_to` FOREIGN KEY (`id`) REFERENCES `questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

注 - 唯一的限制是你需要把InnoDB引擎的表(這是從默認的MyISAM引擎略有不同,檢出summary heremore extensive version here