如何在Doctrine QueryBuilder中使用服务方法

时间:2014-03-24 14:25:06

标签: symfony service doctrine entity

我正在做一个非常大的Symfony2项目(不幸的是在一个我无法修改的数据库中),我坚持这个:

我有一个User实体,其中包含(在其他字段中)用户名字段。

我还有一个ProfileField实体,它与User的额外字段相​​对应(比如firstname或lastname,喜欢的颜色或者你想询问用户的任何内容)。

最后有ConfigService,它基本上可以从数据库获得某个键的特定值。 在这种特殊情况下,它只是一个名为' username_format'的配置值。它可以采用3个值中的一个:'用户名','名字'或' firstnamelastname'。

根据该值,我需要显示格式正确的用户名。如果值为'用户名' - 我只是从User实体返回用户名字段值。 对于第二种和第三种情况,所以当我需要获得与该特定用户相对应的自定义ProfileField时,我已经创建了一个注入了ConfigService的简单服务(称为usernameFormatService)和一个名为getNameFromId($ userId)的方法。该方法检查配置值并为正确的用户提取正确的值。这一切都很好,但是......

我有一个博客概述页面,其中格式化的用户名显示在其他字段中(如标题,创建日期等)。 Blog实体与User实体有很多关系。从映射中我获得了当然的用户名,以及' username_format'配置值说我需要名字,例如,我在Twig模板中用usernameFormatService拉它,一切都按照它应该的方式工作。

当我需要能够按每列排序时,真正的问题就开始了,这也意味着格式化的用户名列。我使用Doctrine QueryBuilder来获取数据库结果,基本上我需要用户实体内部的格式化用户名值(我认为)能够在从数据库中提取之前按此值对博客进行排序(之前为什么?分页) )。

任何人都可以给我至少一个暗示在哪里看或怎么做?

更新

为了更清楚地说明:

现在,概要表中显示的用户名正由usernameFormatService解析,后者使用ConfigService获取' platform_username_format' config值构成数据库,并根据该配置值返回格式化的用户名。 如果要进行排序,我需要在实际查询数据库之前以某种方式获取格式化的用户名,这样我就可以获得排序结果。

1 个答案:

答案 0 :(得分:0)

好的,如果我在这里正确地理解了一切,我会做一些如下所示的事情。

现在,不确定的是,每个用户是否都有选择如何查看数据的选项。因此,我在服务定义中硬编码username_format,但这种行为很容易改变。

1。的ConfigService

我会将您的getNameFromId更改为getNameForUser

class ConfigService{
    private $usernameFormat;
    private $repository;

    public function __construct($repository, $usernameFormat){
        $this->repository = $repository;
        $this->usernameFormat = $usernameFormat;
    }

    public function getNameForUser(User $user){
        switch ($this->usernameFormat){
            case "username":
                return $user->getUsername();
            case "firstname":
                return $user->getFirstName();
            case "firstnamelastname":
                reteurn $user->getFirstName() . ' ' . $user->getLastname();
        }
    }

    public function getAllUsers($page){ 
        return $this->repository->getUsers($page, $this->usernameFormat);
    }
}

2。 ConfigService定义

<parameters>
    <parameter key="my.repository.class">Your\Namespace\FooRepository</parameter>
    <parameter key="config.service.class">Your\Namespace\Service\ConfigService</parameter>
</parameters>

<services>
    <service id="user.repository"
             class="%my.repository.class%"
             factory-service="doctrine.orm.entity_manager"
             factory-method="getRepository">
            <argument>YourBundle:User</argument>
    </service>

    <service id="config.service" class="%config.service.class%">
        <argument type="service" id="my.repository.class" />
        <argument type="string">username</argument>
    </service>
</services>

3。存储库

public UserRepository extends EntityRepository{
    public function getUsers($page, $usernameFormat){
        $qb = $this->createQueryBuilder('u');

        /**
         * Rest of quering rules go here: WHERE predicate, ORDERing, pagination
         */

         return $qb->getQuery()->getResult();   
    }
}

希望这有点帮助...