casting doctrine2 type-conversion order dql

Atributos de CASTING para ordenar en una consulta DQL de Doctrine2



type-conversion order (6)

Acabo de hacer algo similar en mi propio código ayer. Pude hacer:

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

Tuve que lanzar el mío como dinero y luego int, pero si no tienes un decimal, no deberías tener ese problema. También puedes intentar lanzar como numérico o usar convertir en lugar de lanzar, pero el lanzamiento es mejor en esta situación.

¿Por qué necesita entity1 como columna si ya tiene el mismo valor en OrderID?

Estoy tratando de obtener Entidades Doctrine2 , ordenadas por su ID, que aparentemente es una Cadena, aunque solo contenga Números. Entonces, lo que me gustaría hacer es algo como esto:

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

¿Hay alguna manera de hacer algo como esto en Doctrine2 ? O bien, ¿cuál sería la mejor práctica para obtener mi resultado si no puedo cambiar el tipo de identificación ( debido a los requisitos del cliente, por supuesto )?

Atención : no estoy pidiendo código SQL, estoy pidiendo una solución Doctrine2, preferiblemente en DQL


Creo que quieres ordenar por entity1 . si el tipo de datos de su entidad1 es un número entero, entonces no es necesario cambiarlo a entero o, en caso contrario, debe hacerlo. a continuación se consulta para usted. Repita este.

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


Pruebe esto sin cambiar el tipo de datos

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


No estoy seguro si esto funciona, pero para acceder a una ID de entidad necesita la función IDENTITY () DQL. Prueba esto:

SELECT entity1 FROM Namespace/Bla/MyEntity ORDER BY IDENTITY(entity1)


Debería poder agregar su propia función para implementar esta característica.

La clase se vería así:

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); } }

Deberás registrar tu función:

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

Entonces puedes usarlo:

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

PD: Al agregar la palabra clave orderId , alias orderId no estará en los resultados (y solo se usa para ordenar).


Según la respuesta de Jasper N. Brouwer, esta es una solución un poco mejorada:

<?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); } }

Ahora debería ser posible escribir DQL así:

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