将MySQL转换为条令查询生成器。IF和CONCAT的问题。或者选择另一种方法进行子查询
我有一个用于分类的表,每个分类都有和id、name和parent_id将MySQL转换为条令查询生成器。IF和CONCAT的问题。或者选择另一种方法进行子查询,mysql,symfony,doctrine,doctrine-orm,Mysql,Symfony,Doctrine,Doctrine Orm,我有一个用于分类的表,每个分类都有和id、name和parent_id Select IF(a.parent_id IS NULL, a.name, CONCAT((SELECT b.name FROM category b WHERE b.id = a.parent_id), " / ", a.name) ) as n, a.id, a.parent_id FROM category a ORDER BY n 我想将其转换为我的Doctrine2查询生成器 $em = $this-&
Select IF(a.parent_id IS NULL, a.name, CONCAT((SELECT b.name FROM category b WHERE b.id = a.parent_id), " / ", a.name) ) as n, a.id, a.parent_id
FROM category a
ORDER BY n
我想将其转换为我的Doctrine2查询生成器
$em = $this->getDoctrine()->getEntityManager();
$qb = $em->createQueryBuilder();
$q = $qb
->select("c.id")
->addSelect(
"IF(c.parent_id IS NULL, c.name, CONCAT((" .
$em->createQueryBuilder()
->select("t.name")
->from("MyBundle:Category", "t")
->getQuery()->getDQL() .
"), \" / \", c.name) )"
)
->from("MyBundle:Category", "c");
echo $q->getQuery()->getSQL();
exit;
类似这样的,但我不能使用
IF
,和CONCAT
,假设您在类别中有一个名为“parent”的关系,这是否更有效
$em = $this->getDoctrine()->getEntityManager();
$qb = $em->createQueryBuilder();
$q = $qb
->select("c.id")
->addSelect("IF (c.parent_id IS NULL, c.name, CONCAT(t.name, ' / ', c.name))"
->from("MyBundle:Category", "c")
->leftJoin("c.parent t"));
echo $q->getQuery()->getSQL();
好的,我找到了解决办法 如果,您可以使用
CASE
而不是IF
。检查此项,但当我使用CASE
时,我无法CONCAT
我的字段:
$em = $this->getDoctrine()->getEntityManager();
$qb = $em->createQueryBuilder();
$q = $qb
->select("c.id")
->addSelect("CASE WHEN (c.parent IS NULL) THEN c.name ELSE 'something' END")
->from("MyBundle:Category", "c")
->leftJoin("c.parent", "t");
echo $q->getQuery()->getSQL();
另一个解决方案是创建您自己的DQL函数,如IF
,并像这样使用它:
$em = $this->getDoctrine()->getEntityManager();
$qb = $em->createQueryBuilder();
$q = $qb
->select("c.id")
->addSelect("IF(c.parent IS NULL, c.name, CONCAT(CONCAT(t.name, ' / '), c.name))")
->from("MyBundle:Category", "c")
->leftJoin("c.parent", "t");
echo $q->getQuery()->getSQL();
要创建此链接,请转到此链接并了解:
我将在这里发布我的IF类和config.yml,以帮助其他人。
下面是IfFunction类(我从中获得):
谢谢您还可以将
案例
和CONCAT
组合在一起:
$q = $this->createQueryBuilder('a')
->select('a.id')
->addSelect('CASE WHEN(a.parent IS NULL) THEN \'\' else CONCAT(:variable, a.name, \'string\') END as name')
->setParameter('variable', $variable)
... ;
谢谢你的提示,这种方法也可以。但是我不知道我不能使用
addSelect
上的IF
。我得到这个错误:[Syntax error]第0行,第13列:错误:预期已知函数,得到'IF'
是,请。。。我也遇到了同样的问题:“->select(数组('SUM(aliasImUsing.fieldCouldBe1Or0=1,1,0)=1)作为num_of one')”。错误消息与最新版本的symfony相同:“[Syntax error]第0行,第11列:错误:预期已知函数,得到'IF'”-dql节点必须位于实体管理器下方
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
dql: #ADDED THIS LINE
string_functions: #ADDED THIS LINE
IF: MyName\MiscBundle\Doctrine\ORM\Query\AST\Functions\IfFunction #ADDED THIS LINE
$q = $this->createQueryBuilder('a')
->select('a.id')
->addSelect('CASE WHEN(a.parent IS NULL) THEN \'\' else CONCAT(:variable, a.name, \'string\') END as name')
->setParameter('variable', $variable)
... ;