2016-12-17 107 views
1

我工作的Symfony 3.2,我試圖做一個「簡單」的查詢。 這是工作的查詢(直接在phpMyAdmin測試)的Symfony和學說:DQL MAX()與GROUPBY

SELECT s.* 
FROM pl_statsheet s 
INNER JOIN (
SELECT day, MAX(points) AS points 
FROM pl_statsheet 
GROUP BY day 
) ps 
ON s.day = ps.day AND s.points = ps.points 

Unfortunelty的SQL版本,我不能「轉換」它與Symfony的工作。希望得到一些幫助,請。這是我迄今爲止所做的。在我的倉庫

$query = $this->getEntityManager() 
    ->createQuery(
     'SELECT s 
     FROM PlayoffBundle:Statsheet s 
     INNER JOIN (
      SELECT day, MAX(points) AS points 
      FROM PlayoffBundle:Statsheet 
      GROUP BY day 
     ) AS ps 
     ON s.day = ps.day AND s.points = ps.points' 
    ) 
    ->getResult(); 

而這個錯誤的Symfony返回

QueryException: [Semantical Error] line 0, col 55 near '( SELECT': Error: Class '(' is not defined.

感謝您的幫助。 我還是Symfony的初學者;)


更新。

因爲我不符合原生SQL。我決定在2個查詢中這樣做。 1 /使用原生SQL,我將得到帶有最大值(點)的ID 2 /使用ORM,我只需要執行findById($ arrayIDs)。做這樣的,因爲我有多對多的關係,讓我得到充分的數據

所以它幾乎工作更容易,但對於原因,我不能已瞭解,我的第二個查詢給空這樣的:

Statsheet {#968 ▼ 
-id: 20 
-stats: null 
-points: null 
-day: null 
-player: null 
-game: null 

}

所以我做了一些測試。我知道,ID 20是最大值

例如,這樣的:

dump($em->getRepository('PlayoffBundle:Statsheet')->find(19)); 

- >將正確地給所有的數據。

dump($em->getRepository('PlayoffBundle:Statsheet')->find(20)); 

- >會給我只是貼了幾行字以上(空到處exept爲ID)

但是,如果我做了 - 在nativeSQL將前>查找(20),它使我的數據正確。

我不知道我的解釋是否足夠清楚。如果需要,我可以提供dump()消息和我的控制器/存儲庫/實體的代碼的屏幕截圖。


StatsheetRepository.php

public function getBestPickId() 
{ 

    $sql = 'SELECT s.* FROM pl_statsheet s INNER JOIN (SELECT day, MAX(points) AS points FROM pl_statsheet GROUP BY day) ps ON s.day = ps.day AND s.points = ps.points'; 

    $rsm = new ResultSetMapping; 
    $rsm->addEntityResult('PlayoffBundle:Statsheet', 's'); 
    $rsm->addFieldResult('s', 'id', 'id'); 
    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm); 
    $picks = $query->getResult(); 

    foreach($picks as $pick){ 
     $ids[] = $pick->getId(); 
    } 
    return $ids; 
} 

這是我的控制器

 $bestpicksIds = $em->getRepository('PlayoffBundle:Statsheet')->getBestPickId(); 
    $bestpicks = $em->getRepository('PlayoffBundle:Statsheet')->findById($bestpicksIds); 

    dump($em->getRepository('PlayoffBundle:Statsheet')->find(20)); 
    dump($em->getRepository('PlayoffBundle:Statsheet')->find(19)); 
    dump($bestpicks); 

因此,讓我趕緊解釋。 ID 19不是最好的選擇,但20是。 所以 - >查找(19)給出需要 的所有數據,但 - >找到(20)和dump($ bestpicks)只給出了ID和數據的其餘部分是NULL 這裏是我的代碼做,現在(也許它會幫助理解):Dump Symfony

我知道這個問題來自於原生SQL查詢。我不知道它爲什麼會影響我的下一個查詢。所以這是我的情況的更新。我知道該怎麼解決,希望我會盡快回來與解決方案;)

我只想補充一點,我已經完成了我的nativeSQL將通過增加這些線路:

$rsm->addFieldResult('s', 'points', 'points'); 
    $rsm->addFieldResult('s', 'stats', 'stats'); 
    $rsm->addFieldResult('s', 'day', 'day'); 

但沒有按到目前爲止,使用諸如遊戲 $ rsm-> addMetaResult('s','game_id','遊戲')的外鍵似乎不起作用。

仍在工作。

回答

0

這種查詢在DQL中不起作用。

你有兩個選擇:

一)使用Doctrine DBAL而不是ORM。 DBAL與使用mysql準備的語句幾乎相同。結果出現在數組中,而不是與ORM一樣處於對象中。

b)使用Native SQL您必須定義手動填充的實體和屬性。

+0

謝謝! 因爲我的所有項目已經在使用ORM,所以我選擇了Native SQL方式。我有它的工作,但我有我的下一個查詢的結果問題。 我會用更多信息編輯我的主要信息。 –

+0

也許你可以添加使用本機查詢的代碼 –

+0

嗨,Sry沒有回答任何更早的,但我離開了最後幾天。所以我發現問題在哪裏。由於我只是試圖用我的本地SQL獲取「id」,它不知何故告訴symfony只接收下一個請求的id。 (不知道你明白我的意思。)無論如何。我通過選擇原生SQL中的整行來解決這個問題。我會盡快更新消息 –