关于重写ORM的save方法的思考

Posted

技术标签:

【中文标题】关于重写ORM的save方法的思考【英文标题】:Thoughts on overriding the save method of ORM 【发布时间】:2011-08-29 13:01:38 【问题描述】:

我正在考虑在使用 Kohana php 框架开发的应用程序中覆盖 ORM 类的保存/创建/更新方法。

我想知道这样做是否是一种好习惯以及利弊。我这样做的原因是将所有重复的代码从控制器中取出,并将其放在模型中被覆盖的方法中的一个位置。

例如。考虑一个简单的民意调查应用程序。有两个 ORM 类 - 具有一对多关系的 Model_Poll 和 Model_Choice。

现在,以下代码将被放置在控制器中,用于创建新的投票并保存在 $_POST 中找到的选项

$poll = ORM::factory('poll');
$poll->name = 'some question ?';
$poll->save();
if ($this->request->post('choices')) 
   foreach ($this->request->post('choices') as $choice) 
       $c = ORM::factory('choice'); 
       $c->name = $choice;
       $poll->add($c);
          

我想把这个改成关注

在控制器中,

$poll = ORM::factory('poll');
$poll->name = 'some question ?';
$poll->set_choices($this->request->post('choices'));
$poll->save();

在 Model_Poll 中,

public function create(Validation $validation = null) 
    $return = parent::create($validation);
    if ($this->_choices) 
        foreach ($this->_choices as $choice) 
           $c = ORM::factory('choice'); 
           $c->name = $choice;
           $this->add($c);
        
    
    return $return;        


public function set_choices($choices) 
    $this->_choices = $choices;

这个 create 方法将被 save 方法内部调用。以后,如果有更多的事情要做,我可以在这里自己做。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您选择的对象不会被保存(需要$c->save()),所以$this->add($c) 也不会工作。

为什么不使用这样的东西:

$poll->save();
$poll->set_choices($this->request->post('choices'));

set_choices() 方法将创建(如果需要)选择并保存当前投票的关系。

【讨论】:

我忘了添加$c->save() 部分。但我喜欢你的方法。感谢您的回复。

以上是关于关于重写ORM的save方法的思考的主要内容,如果未能解决你的问题,请参考以下文章

关于this指向思考

半夜思考, 为什么建议重写 equals()方法时, 也要重写hashCode()方法

关于一道习题的思考

关于JAVA核心技术(卷一)读后的思考(用户自定义类,静态域和静态方法的思考以及方法参数)

关于接口的思考

关于违章停车检测方法的思考