13

テーブル用の単純な列が必要です。

id例として、列と。nameを持つテーブル「プロジェクト」year

私が行った場合:

$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は、ビジュアルパラダイムを使用して自動的に構築されます。

4

2 に答える 2

36

これは、Doctrine がすべてのオブジェクト情報、つまりすべての列で応答を水和するためです。

別の水分補給方法を使用する必要があります。多くの方法がありますが、そのうちの 5 つに焦点を当てましょう。

  • HYDRATE_RECORD、デフォルトのもの
  • HYDRATE_ARRAY
  • HYDRATE_NONE
  • HYDRATE_SCALAR
  • HYDRATE_ARRAY_SHALLOW

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 を使用する場合)。オブジェクトを返すためtoArray()、適切な json を送信できるように呼び出す必要があります。

    [{"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"}]"
    
于 2013-01-19T09:56:57.117 に答える
1

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'];
于 2014-03-10T21:10:37.473 に答える