-1

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

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

如果您可以使用另一种方法轻松实现此目的,请分享它,因为无法找到任何其他方法来做到这一点。

4

1 回答 1

0

好吧,只要您不使用默认查询(findById 等),您正在使用您在表中构建的查询,并且在这种情况下您总是使用createQuery,这就是您应该覆盖的方法(或创建一个新的) )。您还需要确保之后使用 ->andWhere。

一些伪代码来说明我的意思:

想象一下,你有一个模型 Tit。然后你有一个类 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();
  }
}
于 2013-05-03T03:31:16.877 回答