我有一个symfony应用程序,其中包含与场所关联的多个表(或对象)。有时,在整个应用程序中,我必须根据用户导航的当前位置对这些对象进行一些复杂的过滤(查询)。
为了避免在应用程序中为多个模块重复大量代码,我的想法是以某种方式覆盖Doctrine_Query中的execute()函数,以便在传递额外参数(位置值)时应用所需的查询/过滤器它。我不知道如何实现这一点,请帮忙。
如果您可以使用其他方法轻松实现此目的,请分享,因为无法找出其他任何方法。
答案 0 :(得分:0)
只要您不使用默认查询(findById等),您就使用了在表格中构建的查询,在这种情况下,您总是使用 createQuery ,这就是你应该覆盖(或创建一个新方法)的方法。您还需要确保在之后使用 - >和之后。
一些伪代码来表明我的意思:
想象一下,你有一个模型山雀。然后你有一个TitTable类 - > Doctrine_Table 然后创建一个表PlaceDoctrineTable并更改继承: TitTable - > PlaceDoctrineTable - > Doctrine_Table
这将是新课程:
class PlaceDoctrineTable extends Doctrine_Table {
/**
* @param ... @return Doctrine_Query
*/
public function createPlaceSpecificQuery($alias)
{
$placeID = sfContext::getInstance()->... // you could use some service to set the place or placeID could be a parameter of this method
$query = $this->createQuery($alias);
$query->innerJoin("$alias.Place place")
->where('place.id = ?', $placeID)
;
return $query;
}
}
然后在TitTable中:
class TitTable extends PlaceDoctrineTable {
...
public function getLatestTits($limit=1)
{
$query = $this->createPlaceSpecificQuery('t')
->andWhere('t....')
->...
;
return $query->execute();
}
}