Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将MySQL转换为条令查询生成器。IF和CONCAT的问题。或者选择另一种方法进行子查询_Mysql_Symfony_Doctrine_Doctrine Orm - Fatal编程技术网

将MySQL转换为条令查询生成器。IF和CONCAT的问题。或者选择另一种方法进行子查询

将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-&

我有一个用于分类的表,每个分类都有和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->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)
    ... ;