我有一个 symfony 应用程序,其中包含与一个地方相关联的几个表(或对象)。有时,在整个应用程序中,我必须根据用户当前导航的位置对这些对象进行一些复杂的过滤(查询)。
我的想法是,为了避免在应用程序中为多个模块重复大量代码,以某种方式覆盖 Doctrine_Query 中的 execute() 函数,以在将额外参数(位置值)传递给它时应用所需的查询/过滤器。我不知道如何实现这一点,请帮忙。
如果您可以使用另一种方法轻松实现此目的,请分享它,因为无法找到任何其他方法来做到这一点。
我有一个 symfony 应用程序,其中包含与一个地方相关联的几个表(或对象)。有时,在整个应用程序中,我必须根据用户当前导航的位置对这些对象进行一些复杂的过滤(查询)。
我的想法是,为了避免在应用程序中为多个模块重复大量代码,以某种方式覆盖 Doctrine_Query 中的 execute() 函数,以在将额外参数(位置值)传递给它时应用所需的查询/过滤器。我不知道如何实现这一点,请帮忙。
如果您可以使用另一种方法轻松实现此目的,请分享它,因为无法找到任何其他方法来做到这一点。
好吧,只要您不使用默认查询(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();
}
}