2

我在两个表之间有 has_many 关系,例如:“questions”-<“options”[一个问题有很多选项] 我的班级结构是:for question

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 模型,因为它没有加载。"

任何想法?怎么做?

4

2 回答 2

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);
于 2012-06-01T07:53:13.013 回答
1

除了@biakevoron 的帖子,您还有 MySQL 选项;只需在两个表之间添加一个对表有on delete cascade要求的关系options。就我个人而言,我还检查与当前正在处理的对象相关的对象/行,包括显式(删除关系对象)作为游戏的隐式方面。实际上,您应该能够信任 MySQL 做它的工作(它做得很好),但如果有人 ie。改变关系,或将表切换到 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 引擎略有不同,请在此处查看摘要并在此处查看更广泛的版本

于 2012-06-05T01:25:38.857 回答