2017-05-28 86 views
1

我正在此異常DQL查詢使用變量:在Select語句返回異常

[語義錯誤] 0行,列124「附近柱=:列」:錯誤:「列」沒有定義。

當嘗試運行這段代碼:

/** 
* @param User $user 
* @param String $column 
* @return array 
*/ 
public function getStatsByDQL(User $user, String $column) 
{ 
    $midNight = date_create('00:00:00')->format('Y-m-d H:i:s'); 

    $em2 = $this->getDoctrine()->getManager()->getRepository('AppBundle:ExerciseStats') 
     ->createQueryBuilder('g') 
     ->setParameters(array(
      'user' => $user, 'column' => $column, 'date' => $midNight, 
     )) 
     ->where('user = :user', 'g.timestamp < :date', 'column = 
:column') 
     ->select('g.column') 
     ->setMaxResults(1) 
     ->join('g.user', 'user') 
     ->orderBy('g.column','DESC') 

     ->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY); 
     return $em2; 

這裏的它是如何執行:

$yy = $this->getStatsByDQL($usr, 'bench_press_1_weight'); 
    var_dump($yy); 

這DQL查詢時, 'g.column' 被 'bench_press_1_weight' 取代運行良好,但當g.column被放置在那裏時會出錯。我認爲'bench_press_1_weight'應該被傳遞,因爲我在參數'column'=> $ column中設置。對我而言,這應該起作用。我還沒有找到Doctrine docs有任何用處,並嘗試了無數的組合。

此功能在我的默認控制器中。

任何人都有任何線索?提前致謝!

+1

所以你實際上有一個名爲列的數據庫表列?列是MySQL中的保留字,因此不會很好結束。 – Cerad

+0

其實我沒有列名列,如果你看代碼,你會看到它是變量名。這是DQL,而不是SQL,所以我在那裏安全。爲了安全起見,我使用另一個變量名稱對它進行了測試,它沒有任何區別,同樣的確切錯誤消息。 –

+0

DQL轉換爲SQL,因此適用相同的限制。 'column =:column'強烈暗示了一個名爲column的列,就像錯誤消息一樣。你是否試圖動態指定實際列?我想我只是不瞭解設計。 dump($ qb-> getQuery() - > getSQL()會顯示生成的sql。 – Cerad

回答

0

我已經解決了這個問題,它非常簡單,我差點射擊自己。那麼,什麼發生需要的是去除從PARAMS功能和WHERE語句的簽名推出的變量,它看起來像這樣:

public function getStatsByDQL(User $user, String $col) 
{ 

    $midNight = date_create('00:00:00')->format('Y-m-d H:i:s'); 
    $parameters = (array('user' => $user, 'date' => $midNight, 

    )); 
    $em2 = $this->getDoctrine()->getManager()->getRepository('AppBundle:ExerciseStats') 
     ->createQueryBuilder('g') 
     ->setParameters($parameters) 
     ->where('g.user = :user', 'g.timestamp < :date') 
     ->select('g.'. $col) 
     ->setMaxResults(1) 
     ->join('g.user', 'user') 
     ->orderBy('g.'. $col,'DESC') 
     ->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY); 
    return $em2; 
} 

這將返回正確的數據我之後,也就是列要求和它的內容。感謝大家的意見。非常感激。 :)

0

試圖改變這種

->setParameters(array(
     'user' => $user, 'column' => $column, 'date' => $midNight, 
    )) 
    ->where('user = :user', 'g.timestamp < :date', 'column = :column') 

->where('user = :user', 'g.timestamp < :date', 'column = :column') 
    ->setParameters(array(
     'user' => $user, 'column' => $column, 'date' => $midNight, 
    )) 
+0

我已經這樣做了,並沒有改變任何東西。感謝您的輸入。 –

0

試圖改變這種

->setParameters(array(
    'user' => $user, 'column' => $column, 'date' => $midNight, 
)) 
->where('user = :user', 'g.timestamp < :date', 'column = :column') 

有了這個

試圖改變這種

->setParameters(array(
    'user' => $user, 'column' => $column, 'date' => $midNight, 
)) 
->where('g.user = :user', 'g.timestamp < :date', 'g.column = :column') 
+0

我按照你的建議得到這個結果:[Semantical Error] line 0,col 142 near'column =:column ORDER':Error:Class AppBundle \ Entity \ ExerciseStats has no field or association named column –