2013-04-26 65 views
0

我正在使用phpactiverecord。我有一个Order对象,它有一个idcode。在数据库上,id是主键int和自动增量。 code是一个varchar和唯一的,由id和其他字符组成。 问题是我需要在保存前设置代码值,为此,我需要获取该ID。phpactiverecord获取下一个ID

目前我所做的:

class Order extends ActiveRecord\Model{ 
    function save() { 
     if (parent::save()): // I save all data 
      $this->code = "{$this->id}w"; // Once it was saved I get the id 
      parent::save(); // I save the code 
      return true; 
     endif; 
     return false; 
    } 

} 

有没有更优雅的方式来做到这一点?

+0

您可以在保存前添加id列的最大值('select max(id)作为table_name'的最大值),因此您不必执行两次保存。 – Pitchinnate 2013-04-26 15:15:42

+0

我想到了它,但我没有找到用ActiveRecord来做到这一点的方法。 – 2013-04-26 15:17:42

+1

这样做的安全方式是你目前如何做,不雅,但安全.. Pitchinnate评论可能有并发问题,你需要使用锁。 – Nelson 2013-04-26 15:18:28

回答

1

你在技术上不应该以这种方式覆盖save(),因为即使在这种情况下,你正在改变方法签名(它是public function save($validate=true))。你的情况有一堆可能的回调。您的情况下,更好的方法是:

public static $after_create = array('after_create'); 
public function after_create() 
{ 
    $this->code = $this->id.'w'; 
    $this->save(); 
} 

而且它洙难于使用模板的if else里面的类代码:P。 如果你没有github的最新版本,这段代码可能会失败,因为之前有一个bug,after_create不知道这个对象已经被保存了。

+0

什么是更新phpactiverecord的最佳方式?它安全地替换整个文件夹? – 2013-04-30 13:01:53

+0

是的,因为稳定版本已经与最初的版本向后兼容,所以对库进行的所有更新都是如此。 – Anther 2013-04-30 16:34:24