2013-01-19 1 views
9

テーブルには単純な列が必要です。1つの列を選択するDoctrine DQL

例として、テーブルid,nameおよびyearを持つテーブル "project"があります。

私が行う場合:

$q = Doctrine_Query::create() 
     ->select('a.pro_id') 
     ->from('fndr_proyecto a') 
     ->where('a.pro_id =?',1); 
    $pro = $q->execute(); 
    json_encode($pro->toArray()); 

答えは

{"id":1,"name":"Project name","year":2013} 

のようにすべての列ですが、私は1つの列のみを必要としています。私は期待しています:

{"id":1} 

ネイティブSQLがうまく動作するため、DQLを使用しているためです。

ORMは、視覚的パラダイムを使用して自動的に構築されます。

答えて

26

これは、Doctrineがすべてのオブジェクト情報とすべての列で応答するためです。

あなたは異なった水和法、there are many oneを使用する必要がありますが、のは、それらの5に焦点を当ててみましょう:デフォルト1

  • HYDRATE_ARRAY
  • HYDRATE_NONE
  • HYDRATE_SCALAR
  • HYDRATE_ARRAY_SHALLOW

    • HYDRATE_RECORD

    HYDRATE_ARRAY_SHALLOW水和方法が必要です。理由は次のとおりです。

    1. HYDRATE_RECORD

      $q = Doctrine_Query::create() 
          ->select('a.pro_id') 
          ->from('fndr_proyecto a') 
          ->where('a.pro_id = ?',1); 
      $pro = $q->execute(array(), Doctrine_Core::HYDRATE_RECORD); 
      var_dump(json_encode($pro->toArray())); 
      

      これは、オブジェクトを使用して結果を水和し、(あなたがあなたのクエリ内leftJoinを使用している場合)にも関係を水和します。それがオブジェクトを返すので、我々はpropreのJSONを送ることができるようにtoArray()を呼び出す必要があります:

      [{"id":1,"name":"Project name","year":2013}]" 
      
    2. HYDRATE_ARRAY

      $q = Doctrine_Query::create() 
          ->select('a.pro_id') 
          ->from('fndr_proyecto a') 
          ->where('a.pro_id = ?',1); 
      $pro = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY); 
      var_dump(json_encode($pro)); 
      

      配列が自動的に主キーを追加し、これは結果を水和します:

      [{"id":"1","pro_id":"1"}]" 
      
    3. HYDRATE_NONE

      $q = Doctrine_Query::create() 
          ->select('a.pro_id') 
          ->from('fndr_proyecto a') 
          ->where('a.pro_id = ?',1); 
      $pro = $q->execute(array(), Doctrine_Core::HYDRATE_NONE); 
      var_dump(json_encode($pro)); 
      

      これは結果を水和し、ちょうど戻りませんが値:

      [["1"]]" 
      
    4. HYDRATE_SCALARをこれは選択からではなく、などの重要な指標で結果を水和します

      $q = Doctrine_Query::create() 
          ->select('a.pro_id') 
          ->from('fndr_proyecto a') 
          ->where('a.pro_id = ?',1); 
      $pro = $q->execute(array(), Doctrine_Core::HYDRATE_SCALAR); 
      var_dump(json_encode($pro)); 
      

      テーブルの別名を持つカラム名:

      [{"a_pro_id":"1"}]" 
      
    5. HYDRATE_ARRAY_SHALLOW

      $q = Doctrine_Query::create() 
          ->select('a.pro_id') 
          ->from('fndr_proyecto a') 
          ->where('a.pro_id = ?',1); 
      $pro = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY_SHALLOW); 
      var_dump(json_encode($pro)); 
      

      これは、表の別名なしの選択からではなく、列名などの重要な指標で結果を水和します:

      "[{"pro_id":"1"}]" 
      
  • +0

    です。ドキュメント「データハイドレータ」の章を参照してください。私はそれが主題についてであることを知らなかった。 ありがとうございます! ;) –

    +0

    @ h3g0r_それらを試してみると、配列の水和はしばしば記録的な水分よりも速くて軽いです! – j0k

    +0

    非常に良い説明、私はいつもどのようにハイドレーターが動作するのか困惑してきましたが、今はすべて私の心の中ではっきりしています。ありがとう! – TwystO

    0

    私はありませんDoctrine j0kのどのバージョンが使用されていたかを確認してください。いくつかの回答がありましたが、私はDoctrine_QueryクラスとDoctrine_Coreクラスを見つけられませんでした。私はDoctrine 2.3.4を使用しています。次は私のために働いた。

    public static function getAllEventIDs($em) { 
        return parent::getAllFromColumn('\path\to\Entity\entityName', 'id', $em); 
    } 
    
    public static function getAllFromColumn($tableName, $columnName, $em) { 
        $q = $em->createQueryBuilder('t') 
        ->select("t.$columnName") 
        ->from($tableName, 't'); 
    
        $q = $q->getQuery(); 
    
        $result = $q->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR); 
    
        return $result; 
    } 
    

    これは配列の配列を返します。つまり、最初のイベントのIDは

    $result[0]['id']; 
    
    関連する問題