Foros del Web » Programando para Internet » PHP » Symfony »

Symfony2 - Doctrine 2 (Agregar funciones de postgresql a una query en doctrine 2)

Estas en el tema de Symfony2 - Doctrine 2 (Agregar funciones de postgresql a una query en doctrine 2) en el foro de Symfony en Foros del Web. Estimados, Como puedo agregar a una query realizada con un createQueryBuilder o createQuery, una función de postgres ('array_to_string')? He intentado de las siguientes formas. Con ...
  #1 (permalink)  
Antiguo 07/12/2011, 11:03
 
Fecha de Ingreso: mayo-2008
Mensajes: 44
Antigüedad: 15 años, 11 meses
Puntos: 1
Mensaje Symfony2 - Doctrine 2 (Agregar funciones de postgresql a una query en doctrine 2)

Estimados,
Como puedo agregar a una query realizada con un createQueryBuilder o createQuery, una función de postgres ('array_to_string')?

He intentado de las siguientes formas.
Con createQueryBuilder :
Código PHP:
$qb $this->createQueryBuilder('ser');
$expr $qb->expr();


$subQuery 'array_to_string(
         ARRAY(
                        SELECT subAtt.att_description
                        FROM ModulesConfigBundle:Attribute subAtt
                        WHERE subAtt.attLeft < att.attLeft
                        AND subAtt.attRight > att.attRight
         ),
           "/"
 )'
;


$qb->select('pro.proNumericCode, pro.proAlphanumericCode, pro.proDescription, cub.cubId, cub.cubDescription,att.attDescription, ' $expr->some($subQuery))
                ->
join('ser.proNumericCode''pro')
                ->
join('ser.cub','cub')
                ->
join('cub.att','att')
                ->
where('att.attLeft >= :attLeft')
                ->
andWhere('att.attRight <= :attRight')
                ->
setParameter('attLeft'$attLeft)
                ->
setParameter('attRight'$attRight);
$query $qb->getQuery();

//Me tira un Error: Expected known function 'SOME' 

Y con CreateQuery :

Código PHP:

$sql 
'SELECT pro.proNumericCode, pro.proAlphanumericCode, pro.proDescription, cub.cubId, cub.cubDescription,att.attDescription,
            array_to_string(
                ARRAY(
                        SELECT subAtt.att_description
                        FROM ModulesConfigBundle:Attribute subAtt
                        WHERE subAtt.attLeft < att.attLeft
                        AND subAtt.attRight > att.attRight
                    ),
                    "/"
            )
                                     FROM ModulesWarehouseBundle:Series ser
                                     JOIN ser.proNumericCode pro
                                     JOIN ser.cub cub
                                     JOIN cub.att att
                                     WHERE att.attLeft >= ' 
$attLeft '
                                      AND att.attRight <= ' 
$attRight;

$cq $em->createQuery($sql);
$cq->getQuery();

//Me dice Error: Expected known function, got 'array_to_string' 
Espero me puedan ayudar.
Si encuentro la solución la posteo :)


Saludos.
  #2 (permalink)  
Antiguo 07/12/2011, 12:02
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Symfony2 - Doctrine 2 (Agregar funciones de postgresql a una query en doct

recuerda que D2 tiene su propio lenguaje de consulta (DQL) por lo cual en el mismo no se estipulan sino funciones comunes, a modo de que puedas cambiar de DBMS, puedes usar 2 cosas: o native querys o definir una función definida para el AST de doctrine, por ejemplo yo definí:
Código PHP:
Ver original
  1. <?php
  2. namespace DoctrineCustomFunctions\Postgres;
  3.  
  4. use Doctrine\ORM\Query\AST\Functions\FunctionNode;
  5. use Doctrine\ORM\Query\Lexer;
  6.  
  7. /**
  8.  * ParseDateToChar = "to_char" "(" ArithmeticPrimary "," ArithmeticPrimary ")"
  9.  * Based to Benjamin Eberlei <[email protected]>
  10.  *
  11.  * @package         DoctrineCustomFunctions
  12.  * @subpackage      Postgres Custom Functions for Doctrine 2
  13.  * @author          Maycol Alvarez<[email protected]>
  14.  * @copyright       Maycol ALvarez
  15.  * @license         http://www.gnu.org/licenses/gpl-1.0.html
  16.  * @version         v1.0 28/09/2011 12:00 PM
  17.  */
  18. class ParseDateToChar extends FunctionNode
  19. {
  20.     // define las partes de la funcion
  21.     public $firstDateExpression = null;
  22.     public $secondStringExpression = null;
  23.  
  24.     // pasear la funcion y establecer las partes
  25.     public function parse(\Doctrine\ORM\Query\Parser $parser)
  26.     {
  27.         $parser->match(Lexer::T_IDENTIFIER);
  28.         $parser->match(Lexer::T_OPEN_PARENTHESIS);
  29.         $this->firstDateExpression = $parser->ArithmeticPrimary();
  30.         $parser->match(Lexer::T_COMMA);
  31.         $this->secondStringExpression = $parser->ArithmeticPrimary();
  32.         $parser->match(Lexer::T_CLOSE_PARENTHESIS);
  33.     }
  34.  
  35.     // devuelve el sql nativo
  36.     public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
  37.     {
  38.         return 'to_char(' .
  39.             $this->firstDateExpression->dispatch($sqlWalker) . ', ' .
  40.             $this->secondStringExpression->dispatch($sqlWalker) .
  41.         ')';
  42.     }
  43. }
y se registra al construir el EntityManager:

$doctrine_config->addCustomStringFunction('to_char', 'DoctrineCustomFunctions\\Postgres\\ParseDateToCha r');
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 05/12/2014, 16:35
 
Fecha de Ingreso: septiembre-2009
Mensajes: 17
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Symfony2 - Doctrine 2 (Agregar funciones de postgresql a una query en doct

Hola, ya se que es viejo el tema, pero no funciona y me aparece que la funcion que intento registrar no se encuentra en .../vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 3096' algo falto, que será?

gracias

Etiquetas: doctrine, funciones, postgresql, query, select, symfony2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:53.