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?
La gramática BNF para Doctrine Query Language no parece contener nada relacionado con una construcción CASE
.
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();
Las declaraciones de casos parecen haberse agregado a la doctrina en algún momento: https://github.com/doctrine/orm-documentation/commit/189c729f15d2fafecf92662cad9553c2ec3dccd7#diff-0
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ó ...