我有两个表之间的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模型,因为它未加载。“
任何想法?怎么做?
答案 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 here和more extensive version here。