7

我有一个我想用 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();

它在“案例”上呕吐。该文档没有提到它是可能的(或不是)。

我想知道 Doctrine 是否缺乏这样做的能力。如果是这样,这是一个相当大的遗漏。有谁知道解决方法?

4

5 回答 5

28

我只是遇到了同样的问题,乍一看,似乎有一个解决方法。我相信您可以通过将 Doctrine Select 解析器包装在括号中来“愚弄” Doctrine Select 解析器将其视为子查询。

试试这个:

$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();
于 2010-10-23T22:25:19.207 回答
4

案例陈述似乎在某些时候被添加到学说中: https ://github.com/doctrine/orm-documentation/commit/189c729f15d2fafecf92662cad9553c2ec3dccd7#diff-0

于 2012-02-01T01:55:54.527 回答
3

Doctrine Query Language的BNF 语法似乎不包含与CASE构造相关的任何内容。

于 2009-10-14T09:15:25.270 回答
2

正如adavea所提到的,Doctrine 现在增加了对CASE表达式的支持。你可以做类似的事情

 $resultset = Doctrine_Query::create()
->select("t.code, t.description")
->addSelect("CASE WHEN(t.id_outcome = 1) THEN 1 ELSE 0 END as in_progress")
->from('LuOutcome t')
->orderBy('t.rank')
->fetchArray();

希望这可能对某人有所帮助,谢谢!

于 2019-01-08T14:36:20.277 回答
0

我在这里遇到了同样的问题。我的项目很旧,并试图快速修复它。所以我只是稍微修改一下 Doctrine 的代码,这样我就可以使用“case when”了。这是我的 Doctrine 1.1.3 代码。

Doctrine/Query.php,将行从 658 更改为 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;

这不是一个很大的变化,但它帮助了我......

于 2012-03-07T03:09:13.673 回答