web-dev-qa-db-ja.com

1つの列を選択Doctrine DQL

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

たとえば、列idname、および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は、ビジュアルパラダイムを使用して自動的に構築されます。

11
h3g0r_

これは、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を使用する場合)。オブジェクトを返すため、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));
    _

    これにより、selectの結果がハイドレイトされますが、テーブルエイリアスの列名としてキーインデックスが使用されます。

    _[{"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));
    _

    これにより、selectの結果がハイドレイトされますが、テーブルエイリアスなしで列名としてキーインデックスが使用されます。

    _"[{"pro_id":"1"}]"
    _
32
j0k

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'];
0
Julien Lamarche