【问题标题】:Override execute() function to use a predefined query覆盖 execute() 函数以使用预定义的查询
【发布时间】:2013-04-27 06:56:01
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    只要您不使用默认查询(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();
      }
    }
    

    【讨论】:

    • 嗨。感谢您的回答。我看了一下 createQuery 函数,它似乎符合我的需要。现在,还有两个关于此的问题。首先,我为什么要覆盖这个而不是执行,其次,我应该创建什么文件结构来覆盖函数?
    • 从技术上讲,这并没有什么不同;我只是觉得那里更有意义。实际上,最好有一个名为 createQueryWithPlace() 的新方法,并确保您始终使用它。我会用一些伪代码来完成我的回答。
    猜你喜欢
    • 2021-04-18
    • 2014-09-27
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多