将派生字段添加到Doctrine_Record子类的最佳方法是什么?

时间:2011-01-19 23:20:05

标签: php doctrine

想象一下,我有一个名为“item”的表,其中有一个名为“price”的列。除了全价之外,我想在12个月内得到价格,即

class Item extends Doctrine_Record {
  ...
  public function getMonthlyPrice() {
    return $this->price/12;
  }
}

现在,假设我希望Item的行为与每月价格只是另一列而不是函数调用,例如

$m = Doctrine_Core::getTable("Item")->find(1);
echo $m->price; //prints 120
echo $m->monthlyPrice; //prints 10

我的第一直觉是覆盖__get()方法。在Doctrine中有更好或更标准的方法吗?


加分问题:

是否有一些非常聪明的方法可以装配物体,所以当我这样做时

var_dump($m->getData())

我看到了

array
  'price' => 120
  'monthlyPrice' => 10

非常漂亮。

2 个答案:

答案 0 :(得分:1)

我认为您需要的是记录过滤器。我真的不知道Doctrine,我主要使用Propel自己;但这听起来似乎可以实现你所需要的:

http://www.doctrine-project.org/projects/orm/1.2/docs/manual/defining-models/pl#record-filters

答案 1 :(得分:0)

正如布莱恩所说,你可以用过滤器做到这一点,但是我认为还有另一种方法可以更接近你正在寻找的东西 - 你需要启用Doctrine的ATTR_AUTO_ACCESSOR_OVERRIDE功能,这意味着它将检查方法与您的属性匹配的表单get *和set *会自动调用它们。这是一个例子:

class Example extends Doctrine_Record {

    public function getFoo() {
        return 'foo';
    }
}

Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true);

$example = new Example();
echo $example->foo;

关于你问题的第二部分,不是我见过的 - 你最好的选择是在你的模型中适当地覆盖方法,或者创建一个Doctrine_Record的子类,你的模型然后扩展,它有一个覆盖,包装了这个功能。