删除具有has_many关系的相关记录

时间:2012-06-01 06:57:42

标签: kohana kohana-3 kohana-orm

我有两个表之间的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',
    ),
); .... .

我尝试使用以下代码删除所有选项的问题:

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

但是它给出了错误

  

错误“:”无法删除admin_sysquestionoption模型,因为它未加载。“

任何想法?怎么做?

2 个答案:

答案 0 :(得分: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 :(得分:1)

除了@biakevoron之外,你还有MySQL选项;只需在on delete cascade表上添加options要求的两个表之间的关系。就个人而言,我还检查与当前对象相关的对象/行,覆盖显式(删除关系对象)作为游戏的隐含方。事实上你应该能够信任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