1

我有一个表单,其中有一个连接到实体的字段:

->add('category', EntityType::class, array(
                'class' => ProductCategory::class,
                'required' => true,
                'query_builder' => function(ProductCategoryRepository $repo) {
                    return $repo->createCategoryStructuredQuery();
                }
            ))

但是在回购中我必须使用以下查询:

SELECT c.* FROM product_category c order by coalesce(c.parentid, c.id), c.parentid is not null, c.name

Doctrine 由于合并而引发异常并且在 order 子句中不为空,我在 createCategoryStructuredQuery() 中创建了一个本机查询:

public function createCategoryStructuredQuery() {
    $rsm = new ResultSetMapping();

    $rsm->addEntityResult('ProductBundle\Entity\ProductCategory', 'c');

    $nativeQuery = $this->getEntityManager()
            ->createNativeQuery(
                'SELECT c.* 
                FROM product_category c 
                order by coalesce(c.parentid, c.id), 
                      c.parentid is not null, 
                      c.name',
                      $rsm
            );
}

如何返回 QueryBuilder 实例以将其正确分配给表单字段?或者我怎样才能使用查询生成器正确构建上面的学说查询?

4

2 回答 2

2

您可以COALESCE直接在查询生成器中使用。实际上,您可以将其添加到SELECT语句中,然后将其用于订购。您需要声明此字段HIDDEN,以便将其从最终结果中排除。

->add('category', EntityType::class, array(
    'class' => ProductCategory::class,
    'required' => true,
    'query_builder' => function(ProductCategoryRepository $repo) {
        return $repo->createQueryBuilder('pc')
            ->select('pc, COALESCE(pc.parentid, pc.id) as HIDDEN orderId, -pc.parentId AS HIDDEN inverseParentId')
            ->orderBy('orderId', 'ASC')
            ->addOrderBy('inverseParentId', 'DESC')
            ->addOrderBy('pc.name', 'ASC')
            ->getQuery()->getResult();
    }
));
于 2018-01-21T01:09:07.327 回答
0

正如我所看到的代码,Doctrine 的异常只是一个开始。尽管它应该返回任何值,但您的函数不会返回任何值。其次,您必须对您创建的 $nativeQuery 变量执行 getResult() 方法。第三,即使您返回了 getResult() 方法的结果,它仍然不是一个 queryBuilder 对象(正如表单中的回调所期望的那样),而是一个数组。

为什么不留在回调函数中并返回:

return $repo->createQueryBuilder('c')
    // here build your query with qb functions, e.g. ->orderBy(arg1 [, arg2])
于 2018-01-20T23:33:45.200 回答