Symfony 原则:如何在ORDERBY条件中添加if语句?

Symfony 原则:如何在ORDERBY条件中添加if语句?,symfony,doctrine-orm,Symfony,Doctrine Orm,我尝试编写这种查询: $qb = $this ->createQueryBuilder() ->select('gh') ->orderBy("IF(gh.language = 'en', 1, 0)", 'desc') ->getQuery(); 它是如何工作的?据我所知,在教义中你不能这样做。在MySQL中,您将使用CASE,并且是特定于供应商的关键字 简短的回答:你不能 长答覆: 条令只支持有

我尝试编写这种查询:

    $qb = $this
        ->createQueryBuilder()
        ->select('gh')
        ->orderBy("IF(gh.language = 'en', 1, 0)", 'desc')
        ->getQuery();

它是如何工作的?

据我所知,在教义中你不能这样做。在MySQL中,您将使用
CASE
,并且是特定于供应商的关键字

简短的回答:你不能

长答覆:

条令只支持有限的SQL函数子集,因为它是灵活构建的,而不是特定于SQL引擎的。因此,IF语句之类的语句没有实现到条令中,并且不会实现,因为MySQL处理IF的方式与PostgreSQL的方式不同(它甚至不存在)

然而,条令2非常强大,它允许您编写自己的函数,并扩展其功能,但是我不建议您这样做,除非确实有必要这样做

您可以在其文档中找到有关用户定义函数和原则的更多详细信息:

我要做的是编写原始SQL来查询数据库。您必须创建一个自定义存储库,以保持代码的整洁和有序

自定义存储库是实体的“扩展”

例如,如果您有一个实体
GH
,那么您的实体类如下所示:

<?php
namespace YourNamespace\ProjectName\WhateverBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * GH
 *
 * @ORM\Table(name="GH")
 * @ORM\Entity(repositoryClass="YourNamespace\ProjectName\WhateverBundle\GHRepository")
 */
class Category {}
<?php
namespace YourNamespace\ProjectName\WhateverBundle\Entity;
use Doctrine\ORM\EntityRepository;
use PDO;

class GH Repository extends EntityRepository {
}
public function findAllProductsByCategory($categoryId) {
    $pdo = $this->getEntityManager()->getConnection();
    $findProductsQuery =
    "SELECT
      P.*
    FROM
        Products P
        LEFT JOIN Types_Products TP ON TP.product_id = P.id
        LEFT JOIN Types T ON TP.type_id = T.id
        LEFT JOIN Categories_Types CT ON CT.type_id = T.id
        LEFT JOIN Categories C ON CT.category_id = C.id
    WHERE
        C.id = :categoryId
    GROUP BY
        P.id";
    $stmt = $pdo->prepare($findProductsQuery);
    $stmt->bindParam(':categoryId', $categoryId, PDO::PARAM_INT);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
然后,您可以在类中创建公共函数,这些函数使用原始SQL查询数据库。惯例是以
findBy
findAllBy
开头命名函数,但这不是必需的

例如,我的一个函数如下所示:

<?php
namespace YourNamespace\ProjectName\WhateverBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * GH
 *
 * @ORM\Table(name="GH")
 * @ORM\Entity(repositoryClass="YourNamespace\ProjectName\WhateverBundle\GHRepository")
 */
class Category {}
<?php
namespace YourNamespace\ProjectName\WhateverBundle\Entity;
use Doctrine\ORM\EntityRepository;
use PDO;

class GH Repository extends EntityRepository {
}
public function findAllProductsByCategory($categoryId) {
    $pdo = $this->getEntityManager()->getConnection();
    $findProductsQuery =
    "SELECT
      P.*
    FROM
        Products P
        LEFT JOIN Types_Products TP ON TP.product_id = P.id
        LEFT JOIN Types T ON TP.type_id = T.id
        LEFT JOIN Categories_Types CT ON CT.type_id = T.id
        LEFT JOIN Categories C ON CT.category_id = C.id
    WHERE
        C.id = :categoryId
    GROUP BY
        P.id";
    $stmt = $pdo->prepare($findProductsQuery);
    $stmt->bindParam(':categoryId', $categoryId, PDO::PARAM_INT);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
我可以在任何控制器中使用此功能,如下所示:

    $doctrine = $this->getDoctrine();
    $em = $doctrine->getManager();
    $categoryRepository = $em->getRepository('MyBundle:Category');
    $products = $categoryRepository->findAllProductsByCategory($category->getId());

谢谢你的回答,不过我的问题是关于orderby条件中if语句的:if(gh.language='en',1,0)“@pico34我理解你的问题,我告诉你,你试图这样做的方式,简单明了是不可能的。教条不允许这样做。你要么在条令中创建一个函数,要么为它编写原始SQL。