【问题标题】:Delete related records , having has_many relationship删除相关记录,有has_many关系
【发布时间】:2012-06-01 06:57:42
【问题描述】:

我在两个表之间有 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();

但是报错了

error":"无法删除 admin_sysquestionoption 模型,因为它没有加载。"

有什么想法吗?怎么办?

【问题讨论】:

    标签: kohana kohana-3 kohana-orm


    【解决方案1】:

    加载多个关系时必须调用find_all:

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

    或者使用DB QBuilder进行多次删除:

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

    【讨论】:

      【解决方案2】:

      除了@biakevoron 的帖子,您还有 MySQL 选项;只需在options 表上添加on delete cascade 要求的两个表之间的关系。就我个人而言,我还检查与当前正在处理的对象相关的对象/行,包括显式(删除关系对象)作为游戏的隐式方面。实际上,您应该能够信任 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 引擎略有不同,请查看 summary heremore extensive version here

      【讨论】:

        猜你喜欢
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 2019-08-26
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多