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。