4

複数の列で orderBY を使用したいのですが、それらは 1 つの列のように動作する必要があります。テーブルは次のようになります。

col1 | col2
5    |
2    |
     | 3
7    |
     | 1
     | 1

結果は次のようになります。

col1 | col2
     | 1
     | 1
2    |
     | 3
5    |
7    |

生の SQL を使用する場合は、using のようなメソッドがありますCOALESCE

しかし、Doctrine QueryBuilder でこれをどのように達成できるのでしょうか?

編集:

私は次のように orderBy を試しました:

qb->orderBy("COALESCE(col1, col2)", "DESC");

そして、このように

qb->add("orderBy", "COALESCE(col1, col2) DESC");

しかし、どちらの場合も、次のエラーがスローされました。

[Syntax Error] line 0, col 700: Error: Expected end of string, got '(' 
4

1 に答える 1

5

selectステートメントに注文列を追加してから、それで注文してみてください。

$qb = $em->createQueryBuilder();
$qb
    ->select('entity', 'COALESCE(col1, col2) as orderCol')
    ->from('Namespace/Entity', 'entity')
    ->orderBy('orderCol', 'DESC')

beberlei/DoctrineExtensionsライブラリのIFを使用すると役立つ場合があります。composer を使用してインストールし (または、必要に応じて 1 つのファイルをコピーすることもできます)、

config.ymlに関数を登録する

doctrine:
    orm:
      entity_managers:
        default:
          dql:
            string_functions:
              IF: DoctrineExtensions\Query\Mysql\IfElse 

クエリを作成します

$qb = $em->createQueryBuilder();
$qb
    ->select('entity', 'IF(col1, col1, col2) as orderCol')
    ->from('Namespace/Entity', 'entity')
    ->orderBy('orderCol', 'DESC')

別のオプションは、純粋な mysql でネイティブ クエリを使用し、結果をエンティティにマップすることです。

于 2013-11-17T14:14:34.177 に答える