2010-10-04 50 views
2

我是新來的Doctrine,但有點熟悉SQL。我有一個非常簡單的用戶和挑戰模式。每個挑戰都有一個「挑戰者ID」和一個「對手ID」,它們是外鍵進入用戶表。我想打印所有挑戰的列表,輸出是用戶表中的名稱。這是我的學說查詢;只有返回一行的原則查詢?

$q = Doctrine_Query::create() 
     ->select('u1.name challenger, u2.name opponent') 
     ->from('Challenge c') 
      ->leftJoin('c.Challenger u1') 
      ->leftJoin('c.Opponent u2'); 

問題是這隻返回一行。我用getSqlQuery()命令來查看生成的SQL這最終是:

SELECT u.name AS u__0, u2.name AS u2__1 FROM challenge c 
LEFT JOIN user u ON c.challenger_id = u.id 
LEFT JOIN user u2 ON c.opponent_id = u2.id 

預期當第三方SQL客戶端運行此查詢檢索所有行。任何想法如何從Doctrine獲得所有行?我使用的是$q->execute(),我知道它應該適用於多行。

謝謝。

+3

嘗試$ q-> count()並查看它得到的行數。另外,使用 _dev.php來訪問查詢。運行後,單擊數據庫並查看它實際正在運行的查詢。我不確定這與getSqlQuery()會返回什麼不同。 – gregghz 2010-10-04 00:41:33

+0

謝謝。 $ q-> count()暴露了查詢返回了正確數量的結果,並且我需要閱讀正確使用DoctrineCollection對象。這超出了我的問題的範圍,所以我會將其關閉。 – LVB 2010-10-04 01:02:49

+1

太棒了,歡迎您將我的評論標記爲「很棒」的評論;) – gregghz 2010-10-04 02:28:51

回答

2

我剛剛遇到了這個問題,在我的情況下,問題是我的查詢沒有從FROM表中選擇任何字段。示例:

$query = Doctrine_Query::create() 
      ->select(
       'ghl.id as id, 
       ghl.patbase_id as patbase_id, 
       ghl.publication_no as publication_no, 
       ghl.priority_no as priority_no 
       ' 
      ) 
      ->from('GridHitListContents ghlc') 
      ->leftJoin('ghlc.GridHitList ghl') 

正如您所看到的,GridHitListContents表中沒有選定的字段。 與$ query-> count()我得到2000ish結果,但與$ query-> fetchArray()只有第一個。 當我加入

$query = Doctrine_Query::create() 
      ->select(
       'ghlc.id, 
       ghl.id as id, 
       ... 
       ' 
      ) 
      ->from('GridHitListContents ghlc') 
      ->leftJoin('ghlc.GridHitList ghl') 

我收回了我的所有結果。

+1

這也解決了我的問題。 我在我的SQL中運行了一個'table。*',但是它結合了結果並返回了一行。包含'table.id AS table_id,table。*'作爲select返回所需的每一行。 – frodosghost 2017-10-06 02:32:53

5

對我來說,它的工作由chaning水化模式:設置,那麼

$result = $query->execute(array(), Doctrine_Core::HYDRATE_SCALAR); 

結果集返回數組,而不是對象。

+0

我做到了這一點,它的工作原理,但所有的領域成爲我選擇的第一個表的別名的前綴。 – shousper 2012-09-14 06:12:44

0

使用此$result = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY)

1

$query->fetchOne()工作對我罰款。