Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengonversi MySQL ke Pembuat Kueri Doktrin. Masalah dengan JIKA dan CONCAT. Atau pendekatan lain untuk subkueri pada pilih

Oke saya menemukan solusinya.

Anda dapat menggunakan CASE bukannya IF . Lihat ini, tetapi ketika saya menggunakan CASE Saya tidak bisa CONCAT bidang saya:

$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();

Solusi lain adalah membuat fungsi DQL Anda sendiri, seperti IF dan gunakan seperti ini:

$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();

Untuk membuat ini JIKA Anda dapat membuka tautan ini dan mempelajari:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/ dql-doctrine-query-language.html#adding-your-own-functions-to-the-dql-language

Saya akan memposting di sini kelas saya untuk JIKA ini dan config.yml untuk membantu orang lain. Berikut adalah kelas IfFunction (saya mendapatkannya dari https://github.com/beberlei/DoctrineExtensions/blob/master/src/Query/Mysql/IfElse.php ):

<?php
namespace MyName\MiscBundle\Doctrine\ORM\Query\AST\Functions;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;

/**
 * Usage: IF(expr1, expr2, expr3)
 * 
 * If expr1 is TRUE (expr1 <> 0 and expr1 <> NULL) then IF() returns expr2;
 * otherwise it returns expr3. IF() returns a numeric or string value,
 * depending on the context in which it is used. 
 * 
 * @author  Andrew Mackrodt <[email protected]>
 * @version 2011.06.19
 */
class IfFunction extends FunctionNode
{
    private $expr = array();

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->expr[] = $parser->ConditionalExpression();

        for ($i = 0; $i < 2; $i++)
        {
            $parser->match(Lexer::T_COMMA);
            $this->expr[] = $parser->ArithmeticExpression();
        }

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return sprintf('IF(%s, %s, %s)',
            $sqlWalker->walkConditionalExpression($this->expr[0]),
            $sqlWalker->walkArithmeticPrimary($this->expr[1]),
            $sqlWalker->walkArithmeticPrimary($this->expr[2]));
    }
}

Setelah itu Anda perlu memperbarui config.yml Anda seperti ini (hanya menambahkan 3 baris terakhir):

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

Terima kasih



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggabungkan dua tabel dengan sql GABUNG?

  2. Menyimpan Nomor Jaminan Sosial

  3. Cara mendapatkan hanya baris pertama dari ResultSet

  4. Tipe data untuk URL

  5. Permintaan Pemesanan yang Tumpang Tindih