Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL को सिद्धांत क्वेरी बिल्डर में कनवर्ट करना। IF और CONCAT के साथ मुद्दे। या चयन पर उपश्रेणियों के लिए एक और दृष्टिकोण

ठीक है, मुझे इसका हल मिल गया।

आप 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();

इसे बनाने के लिए यदि आप इस लिंक पर जा सकते हैं और सीख सकते हैं:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/ dql-doctrine-query-language.html#adding-your-own-functions-to-the-dql-language

मैं अन्य लोगों की सहायता के लिए इस IF और config.yml के लिए अपनी कक्षा यहां पोस्ट करूंगा। यहां इफफंक्शन वर्ग है (मुझे वह 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]));
    }
}

उसके बाद आपको अपने config.yml को इस तरह अपडेट करना होगा (बस अंतिम 3 लाइनें जोड़ी गईं):

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

धन्यवाद



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL जॉइन का मूल्यांकन किस क्रम में किया जाता है?

  2. एकल JDBC स्टेटमेंट ऑब्जेक्ट का उपयोग करके कई प्रश्नों को निष्पादित करें

  3. SQL INSERT से चयन करें

  4. पायथन MySQLdb अपवाद

  5. एकाधिक तालिकाओं के साथ MySQL क्वेरी