7
votes

En utilisant un «cas» quand »dans une instruction de doctrine Select

J'ai une requête SELECT que je voudrais effectuer avec la 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();


2 commentaires

S'il vous plaît ajouter une balise PHP à cette question


fait ... dans au moins 15 caractères: - /


5 Réponses :


3
votes

the grammaire BNF pour le Doctrine Query Language ne semble pas contenir quoi que ce soit lié à un cas construction.


0 commentaires

28
votes

J'ai juste eu le même problème et, à première vue, semble avoir une solution de contournement. Je crois que vous pouvez «tromper» la doctrine Sélectionnez un analyseur à le traiter comme une sous-requête en l'enveloppant entre parenthèses.

Donnez ceci un essai: P>

$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();


0 commentaires

4
votes

Les déclarations de cas semblent avoir été ajoutées à la doctrine à un moment donné: https://github.com/doctrine/ormi-documentation/commit/189C729F15D2FAFECF92662CAFE9553C2EC3DCCD7 # diff-0


0 commentaires

0
votes

J'ai eu le même problème ici. Mon projet est très vieux et essayé de le réparer rapidement. Donc, je change simplement un peu le code de la doctrine afin que je puisse utiliser "cas quand". Ceci est mon code pour la doctrine 1.1.3.

Doctrine / Query.php, modifier des lignes de 658 à 674: P>

        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;


0 commentaires

2
votes

Comme mentionné par ​​Adavea , la doctrine a maintenant ajouté la prise en charge de case expressions. Vous pouvez faire quelque chose comme xxx

espoir que cela pourrait aider quelqu'un, merci!


0 commentaires