2011-09-13 17 views
14

पर ऑर्डर करने के लिए CASTING विशेषताएँ सिद्धांत 2 इकाइयां प्राप्त करने की कोशिश कर रहा है, जो उनके आईडी द्वारा क्रमशः एक स्ट्रिंग है, हालांकि इसमें केवल संख्याएं हैं।एक डॉक्टर 2 डीक्यूएल क्वेरी

SELECT entity1, cast (entity1.id AS integer) AS orderId 
FROM Namespace\Bla\MyEntity 
ORDER BY orderId 

वहाँ Doctrine2 में इस तरह कुछ करने के लिए एक रास्ता है: तो मैं करना चाहते हैं क्या कुछ इस तरह है? या, यदि मैं की ग्राहक आवश्यकताओं के कारण आईडी () के प्रकार को नहीं बदल सकता तो मेरा परिणाम प्राप्त करने का सबसे अच्छा अभ्यास क्या होगा?


ध्यान: मैं एसक्यूएल कोड नहीं कह रहा हूँ, मैं एक Doctrine2 समाधान के लिए पूछ रहा हूँ, अधिमानतः DQL

+0

मुझे लगता है कि आप एक '(' लाइन 13. – DonJuwe

उत्तर

16

इस सुविधा को लागू करने के लिए आपको add your own function पर सक्षम होना चाहिए।

namespace MyProject\Query; 

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

class CastAsInteger extends FunctionNode 
{ 
    public $stringPrimary; 

    public function getSql(SqlWalker $sqlWalker) 
    { 
     return 'CAST(' . $this->stringPrimary->dispatch($sqlWalker) . ' AS integer)'; 
    } 

    public function parse(Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 

     $this->stringPrimary = $parser->StringPrimary(); 

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

आप अपने समारोह पंजीकरण करना होगा:

SELECT e, INT(e.id) AS HIDDEN orderId FROM Namespace\Bla\MyEntity e ORDER BY orderId 

पुनश्च:

$config = $em->getConfiguration(); 
$config->addCustomNumericFunction('INT', 'MyProject\Query\CastAsInteger'); 

तो फिर तुम इसका उपयोग कर सकते

वर्ग कुछ इस तरह दिखेगा: HIDDEN कीवर्ड जोड़कर, उपनाम orderId परिणाम में नहीं होंगे (और केवल ord के लिए उपयोग किया जाता है ering)।

+0

मेरे अपने फ़ंक्शन में, मेरे पास 'u.group' की तरह 'सिंगलवैल्यूडपेथएक्सप्रेस' है और इसे" CAV "(" सिंगलवैल्यूड पाथएक्सप्रेस "AS DECIMAL (10,2))" वास्तविक अभिव्यक्ति ऑब्जेक्ट्स का उपयोग करके "लपेटना" है। । मुझे यह कैसे करना है? किस तरह का अभिव्यक्ति कास्ट होगा ... जब इसे हस्तनिर्मित किया जाए? –

+0

ठीक कभी नहीं; मैंने एक कस्टम अभिव्यक्ति का उपयोग किया और अपनी आवश्यकताओं के अनुरूप अपनी '-> प्रेषण()' विधि संशोधित की। अपेक्षित के रूप में क्लीनर। सिद्धांत भयानक है। :) –

+1

यदि लक्ष्य डेटाबेस MySQL है, तो यह पंक्ति काम नहीं करती है: 'वापसी' CAST ('$ $-> stringPrimary-> प्रेषण ($ sqlWalker)।' पूर्णांक के रूप में) ''; इसे आज़माएं: 'वापसी' CAST ('$ $-> स्ट्रिंग प्राथमिक-> प्रेषण ($ sqlWalker)।' जैसा हस्ताक्षर किया गया है) '; ' – Hokusai

0

में मुझे लगता है कि आप entity1 द्वारा आदेश चाहते हैं। यदि आपकी इकाई 1 डेटा प्रकार पूर्णांक है तो इसे पूर्णांक में बदलने की आवश्यकता नहीं है या यदि ऐसा नहीं है तो आपको इसे करना चाहिए। नीचे आपके लिए क्वेरी है। इसे एक करें।

select entity1,cast(entity1 as integer) as order_id from Table_Name order by 1 asc; 
+0

इन नहीं है जैसा कि बताया गया है कि मैं ग्राहक आवश्यकताओं के कारण इसे बदल नहीं सकता –

+0

फिर आपके पास मूल्य प्रदर्शित करने और वापस करने का दूसरा विकल्प है .. –

3

बाहर

select (entity1 * 1) as display_value, entity1 as return_value 
     from Table_Name 
    order by 1 asc; 
+0

आपको पता है कि मैं doctrine2 DQL का उपयोग कर रहा हूं और MySQL नहीं? –

-2

मैं बस अपना खुद का कोड कल में कुछ इसी तरह किया डेटा प्रकार को बदलने के साथ द्वारा इस एक कोशिश करें। मैं ऐसा करने में सक्षम था:

select cast(entity1 as int) as OrderID 
from yourtablename 
where yourconditions 

मैं वास्तव में मेरा धन के रूप में कास्ट करने के लिए और फिर int था, लेकिन अगर आप एक दशमलव की जरूरत नहीं है, तो आप उस मुद्दे को नहीं होना चाहिए। आप कास्टिंग के बजाय संख्यात्मक या कन्वर्ट का उपयोग करने का भी प्रयास कर सकते हैं, लेकिन इस स्थिति में कास्ट बेहतर है।

यदि आपके पास पहले से ऑर्डर आईडी में समान मूल्य है तो आपको कॉलम के रूप में इकाई 1 की आवश्यकता क्यों है?

+1

आपको पता है कि मैं doctrine2 DQL का उपयोग कर रहा हूं और MySQL नहीं? –

+1

मुझे इसके बारे में पता नहीं था और मैं sqlserver के लिए एसक्यूएल का उपयोग कर रहा था, mysql नहीं, bu टी वे बहुत समान हैं। – rainhider

0

यह सुनिश्चित नहीं है कि यह काम करता है, लेकिन किसी इकाई आईडी तक पहुंचने के लिए आपको पहचान() DQL फ़ंक्शन की आवश्यकता है। इसे आज़माएं:

SELECT entity1 FROM Namespace\Bla\MyEntity ORDER BY IDENTITY(entity1) 
1

जैस्पर एन के आधार पर।ब्रौवेर जवाब है, यह एक छोटा सा बढ़ाया समाधान है:

<?php 
namespace MyProject\Query; 

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

class Cast extends FunctionNode 
{ 
    /** @var \Doctrine\ORM\Query\AST\PathExpression */ 
    protected $first; 
    /** @var string */ 
    protected $second; 
    /** 
    * @param SqlWalker $sqlWalker 
    * 
    * @return string 
    */ 
    public function getSql(SqlWalker $sqlWalker) 
    { 
     return sprintf("CAST(%s AS %s)", 
      $this->first->dispatch($sqlWalker), 
      $this->second 
      ); 
    } 


    /** 
    * @param Parser $parser 
    * 
    * @return void 
    */ 
    public function parse(Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 
     $this->first = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_AS); 
     $parser->match(Lexer::T_IDENTIFIER); 
     $this->second = $parser->getLexer()->token['value']; 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 
} 

अब यह संभव द्वारा होना चाहिए इस तरह DQL लिखने के लिए:

SELECT e, CAST(e.id AS integer) AS HIDDEN orderId FROM Namespace\Bla\MyEntity e ORDER BY orderId 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^