raw query nativo createnativequery php sql doctrine

php - query - Usar un ''caso cuando'' en una instrucción de selección de Doctrine



symfony 3 native query (5)

Tengo una consulta de selección que me gustaría realizar con Doctrine:

$resultset = Doctrine_Query::create() ->select("t.code, t.description, case when t.id_outcome = 1 then 1 else 0 end as in_progress") ->from(''LuOutcome t'') ->orderBy(''t.rank'') ->fetchArray();

Y barf en el ''caso''. La documentación no menciona que es posible (o no).

Me pregunto si Doctrine no tiene la capacidad para hacerlo. Si es así, es una omisión bastante importante. ¿Alguien sabe de alguna solución?



Te recomiendo que no uses esta sintaxis CASE para resolver este problema. Parece complicado.

Por qué no quieres

$resultset = Doctrine_Query::create() ->select("t.code, t.description, t.id_outcome") ->from(''LuOutcome t'') ->orderBy(''t.rank'') ->fetchArray();

y luego recorre $ resultset y crea este campo (in_progress) manualmente dependiendo del valor (id_outcome). Puedes usar algún pequeño método pequeño y simple para eso.

Beneficios:

  • sencillo
  • legible

Simplemente tuve el mismo problema y, a primera vista, parece tener una solución. Creo que puede ''engañar'' al analizador de Doctrine Select para tratarlo como una subconsulta envolviéndolo entre paréntesis.

Prueba esto:

$resultset = Doctrine_Query::create() ->select("t.code, t.description, (case when t.id_outcome = 1 then 1 else 0 end) as in_progress") ->from(''LuOutcome t'') ->orderBy(''t.rank'') ->fetchArray();



Tuve el mismo problema aquí. Mi proyecto es muy antiguo y traté de solucionarlo rápidamente. Así que solo cambio un poco el código de Doctrine para poder usar "case when". Este es mi código para Doctrine 1.1.3.

Doctrine / Query.php, cambia las líneas de 658 a 674:

if (count($terms) > 1 || $pos !== false) { if($terms[0]==''case'') { $terms=explode(" as ", $reference); $expression = array_shift($terms); $alias = array_pop($terms); if ( ! $alias) { $alias = substr($expression, 0, $pos); } $componentAlias = $this->getExpressionOwner($expression); $tableAlias = $this->getTableAlias($componentAlias); $expression=str_replace($componentAlias, $tableAlias, $expression); $index=0; $sqlAlias = $tableAlias . ''__'' . $alias; } else { $expression = array_shift($terms); $alias = array_pop($terms); if ( ! $alias) { $alias = substr($expression, 0, $pos); } $componentAlias = $this->getExpressionOwner($expression); $expression = $this->parseClause($expression); $tableAlias = $this->getTableAlias($componentAlias); $index = count($this->_aggregateAliasMap); $sqlAlias = $this->_conn->quoteIdentifier($tableAlias . ''__'' . $index); } $this->_sqlParts[''select''][] = $expression . '' AS '' . $sqlAlias;

No es un gran cambio, pero me ayudó ...