133

オークションテーブルのid列から値の配列を取得したいと思います。これが生のSQLである場合、私は次のように記述します。

SELECT id FROM auction

しかし、Doctrineでこれを実行して実行すると、次のようになります。

$em->createQuery("SELECT a.id FROM Auction a")->getScalarResult(); 

私はこのような配列を取得します:

array(
    array('id' => 1),
    array('id' => 2),
)

代わりに、次のような配列を取得したいと思います。

array(
    1,
    2
)

Doctrineを使用してそれを行うにはどうすればよいですか?

4

6 に答える 6

209

PHP <5.5

を使用できますarray_map。また、配列ごとにアイテムが1つしかないため 、クロージャ'current'を作成する代わりに、コールバックとしてエレガントに使用できます。

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_map('current', $result);

メモリ使用量に関する追加情報については、以下のPetrSobotkaの回答を参照してください。

PHP> = 5.5

jcbwlkrが以下に回答しているように、推奨される使用方法array_column

于 2012-12-20T09:45:44.247 に答える
175

PHP 5.5以降、 array_columnを使用してこれを解決できます

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_column($result, "id");
于 2014-09-26T14:16:40.353 に答える
103

より良い解決策は、を使用することPDO:FETCH_COLUMNです。そのためには、カスタムハイドレーターが必要です。

//MyProject/Hydrators/ColumnHydrator.php
namespace DoctrineExtensions\Hydrators\Mysql;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator, PDO;

class ColumnHydrator extends AbstractHydrator
{
    protected function hydrateAllData()
    {
        return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
    }
}

Doctrineに追加します:

$em->getConfiguration()->addCustomHydrationMode('COLUMN_HYDRATOR', 'MyProject\Hydrators\ColumnHydrator');

そして、あなたはそれをこのように使うことができます:

$em->createQuery("SELECT a.id FROM Auction a")->getResult("COLUMN_HYDRATOR");

詳細: http ://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes

于 2015-07-09T12:03:49.887 に答える
18

Ascariusの答えはエレガントですが、メモリ使用量に注意してください。array_map()渡された配列のコピーを作成し、メモリ使用量を効果的に2倍にします。数十万の配列アイテムを処理する場合、これが問題になる可能性があります。PHP 5.4以降、参照による呼び出し時のパスが削除されたため、実行できません

// note the ampersand
$ids = array_map('current', &$result);

その場合、あなたは明白に行くことができます

$ids = array();
foreach($result as $item) {
  $ids[] = $item['id'];
}
于 2014-03-15T12:49:33.653 に答える
5

Doctrineでは不可能だと思います。PHPを使用して、結果の配列を目的のデータ構造に変換するだけです。

$transform = function($item) {
    return $item['id'];
};
$result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());
于 2012-07-27T09:29:06.667 に答える
5

doctrine / orm 2.10.0にはこれに対する組み込みのソリューションがあるため、https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/reference/dql-doctrine-query-languageを参照してください。 html#scalar-column-hydration

use Doctrine\ORM\AbstractQuery;

$query = $em->createQuery("SELECT a.id FROM Auction a");
return $query->getSingleColumnResult();
// Same as:
return $query->getResult(AbstractQuery::HYDRATE_SCALAR_COLUMN);
于 2021-11-06T13:15:43.033 に答える