2013-03-05 83 views
1

我使用Symfony2中和學說2,我有這個查詢的一個問題:DOCTRINE:IN聲明已訂購?

$query = $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)'); 
    $result = $query->getArrayResult(); 

,我總是得到的結果通過a.id順序,即1然後4,然後12,而我想顯示結果訂購的ID列表:4,然後12然後1

UPDATE 由於@Bram Gerritsent評論,我註冊自定義功能DQL領域,所以這裏是我做了什麼:

  1. 在MyBundle/DQL/Field.php,我已插入下面的代碼(https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/Field.php)(我只是改變了命名空間是namespace MyBundle\DQL;

  2. 然後,我添加爲顯示在我的config.yml以下在Symfony2的文檔(http://symfony.com/doc/2.0/cookbook/doctrine/custom_dql_functions.html

    ORM: auto_generate_proxy_classes: 「%kernel.debug%」 entity_managers: 默認: auto_mapping:真 DQL: string_functions: 領域:MyBundle \ DQL \場

  3. 所以,我寫了下面的查詢$查詢= $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY FIELD(4,12,1)');但我得到這個錯誤:[Syntax Error] line 0, col 75: Error: Expected end of string, got '('

回答

5

你需要看看到MySQL FIELD功能。

在本地MySQL中,你會做這樣的事情:

ORDER BY FIELD(a.id,4,12,1) 

領域功能不是教條2發行版的一部分,但你可以從DoctrineExtensions得到它。

有關更多信息,請參見本StackOverflow post有關使用FIELD功能主義2

編輯

我一直在使用查詢測試,但得到了同樣的語法錯誤。以下查詢適用於我。不知道爲什麼您不能直接使用ORDER BY field(a.id,4,12,1),但必須先在您的選擇中創建一個HIDDEN字段。

SELECT a, field(a.id,4,12,1) as HIDDEN field FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY field 

EDIT2

我做了一些更多的調試和研究和DQL解析器似乎並不by子句,以支持順序字符串函數。我已解決問題並創建了Pull Request

+0

感謝您的回答,我已經更新了我的問題。 – Reveclair 2013-03-05 11:10:56

+0

在查詢中有一個重複的')'。嘗試:'$ em-> createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN(4,12,1)ORDER BY FIELD(4,12,1)');' – 2013-03-05 12:07:02

+0

對不起,很遺憾,這是在stackoverflow錯誤,但它是正確的我的代碼$ query = $ em-> createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN(4,12,1)ORDER BY FIELD(4,12,1) 「);所以我仍然有同樣的錯誤.. – Reveclair 2013-03-05 23:18:40

0

不是很好的領域的功能,但應該工作:

SELECT output.a FROM (
    SELECT a, (CASE WHEN a.id = 4 THEN 1 WHEN a.id = 12 THEN 2 a.id = 1 THEN 3 END) ord FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)) output ORDER BY output.ord