覆盖execute()函数以使用预定义查询

时间:2013-05-02 23:19:40

标签: symfony-1.4 doctrine-1.2 doctrine-query

我有一个symfony应用程序,其中包含与场所关联的多个表(或对象)。有时,在整个应用程序中,我必须根据用户导航的当前位置对这些对象进行一些复杂的过滤(查询)。

为了避免在应用程序中为多个模块重复大量代码,我的想法是以某种方式覆盖Doctrine_Query中的execute()函数,以便在传递额外参数(位置值)时应用所需的查询/过滤器它。我不知道如何实现这一点,请帮忙。

如果您可以使用其他方法轻松实现此目的,请分享,因为无法找出其他任何方法。

1 个答案:

答案 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();
  }
}