想象一下,我有一个名为“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
那非常漂亮。
答案 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的子类,你的模型然后扩展,它有一个覆盖,包装了这个功能。