我使用Symfony2与Doctrine。
我有一个Foo
对象,它是Doctrine实体。在这个对象中,我需要有一个名为bar
的信息,我通过实体属性(即DB字段)的长计算获得。
(简短的)代码看起来像这样:
class Foo {
public __construct() {
computeBarValue();
}
private computeBarValue() {
$this->bar = /*long computation from other attributes*/ ;
}
}
但是现在,它发生了我还需要这个计算来过滤我向Doctrine发出的一些请求的结果。可以这样写:
class FooRepository extends EntityRepository {
public function myFilteredQuery() {
//...
$queryBuilder = $this->_em->createQueryBuilder()
->select('a')
->from($this->_entityName, 'a')
->where( /*long computation from other fields*/ );
//...
}
}
问题是,由于计算代码长而复杂,并且将来可能会更改,因此我不想重复,其中一个出现在实体中,另一个出现在查询构建器定义中(如上所示)。我已经搜索了是否有可能添加"虚拟"计算列与学说(在这里我会添加一个bar
列),但这似乎是不可能的。
是否有一种方法来合并/分解所有这些?
Entities
只是data-holders
,任何关于查询的内容都应该进入repositories
。
对不起,您不能分解来自2种不同语言(PHP和SQL)的相同代码。这就像你想在同一个函数中分解一个PHP代码和一个Javascript代码。
Doctrine最接近的可能性是定义一个自定义DQL函数,里面有PHP代码,但它不会是纯SQL: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html
在不知道你想要达到什么目标的情况下,我不能确定,但也许Doctrine标准可能是你正在寻找的。