5583


doctrineで以下のような形でデータを取得しています。  
$partsNoArrayはINT型の配列、$owner_noはINT型です。

[code]

        $PartsArray = $PartsRepository->createQueryBuilder('p')
                        ->add('where', $expr->andX(
                                $expr->eq('p.owner_no', '?1'),
                                $expr->in('p.parts_no', '?2')
                            ))
                        ->setParameters(array(
                            1 => $owner_no,
                            2 => $partsNoArray
                        ))
                        ->getQuery()
                        ->getResult();
    
[/code]

この取得処理中に`ORDER BY field(p.parts_no,$partsNoArray)`のようなコードを挿入して  
$partsNoArrayの配列の順序通りにデータを取得することは可能でしょうか？

ややこしい質問とは思いますが、よろしくお願いします。


CC BY-SA 3.0
2015-01-29T09:14:58.103
5564
2015-01-29T15:59:28.503
3555
question
php doctrine2
DoctrineのQueryBuilderでORDER BY Fieldを使用したい


英語版stackoverflowに、Doctrine2でMySQLのField関数をつかったORDER BYについて質問／回答がありました。

  * [Doctrine 2 mysql FIELD function in order by](https://stackoverflow.com/questions/5957330/doctrine-2-mysql-field-function-in-order-by)

上記ページのpolianychさんの回答と、それにつけられたMr Hashさんのコメントを合わせて、設定等補足すると以下のようになります。

## Field関数を使えるようエクステンションを有効にする

  * <https://github.com/beberlei/DoctrineExtensions>
  * packagist では [beberlei/DoctrineExtensions](https://packagist.org/packages/beberlei/DoctrineExtensions)

beberlei/DoctrineExtensionsはstableリリースがないので、インストールする場合は次のようにdev-masterを指定します。

[code]

    $ composer require beberlei/DoctrineExtensions:dev-master
    
[/code]

## カスタム関数を登録する

Doctrineを直接使っている場合は、

[code]

    $doctrineConfig = $this->em->getConfiguration();
    $doctrineConfig->addCustomStringFunction('FIELD', 'DoctrineExtensions\Query\Mysql\Field');
    
[/code]

とします（[Doctrineのマニュアル](http://docs.doctrine-project.org/projects/doctrine-
orm/en/latest/cookbook/dql-user-defined-functions.html)）。

Symfonyを使っている場合は、コンフィギュレーションファイルで

[code]

    doctrine:
        orm:
            # ...
            dql:
                string_functions:
                    FIELD: DoctrineExtensions\Query\Mysql\Field
    
[/code]

と記述すれば利用できます（[Symfonyのマニュアル](http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html)）。

## QueryBuilder内の記述

[code]

    $qb
        ->select("r, field(r.id, :ids) as HIDDEN field")
        ->from("Entities\Round", "r")
        ->where("r.id IN :ids")
        ->setParameter('ids', $ids)
        ->orderBy("field");
    
[/code]


CC BY-SA 3.0
2015-01-29T15:59:28.503
5583
2015-01-29T15:59:28.503
2017-05-23T12:38:55.307
-1
5444
5564
answer