エンティティフィールドへの単一列の結果 -ネイティブクエリをご覧ください。 a> およびResultSetMapping これを達成するために。簡単な例として:
use Doctrine\ORM\Query\ResultSetMapping;
$sql = '
SELECT p.*, COUNT(r.id)
FROM products p
LEFT JOIN reviews r ON p.id = r.product_id
';
$rsm = new ResultSetMapping;
$rsm->addEntityResult('AppBundle\Entity\Product', 'p');
$rsm->addFieldResult('p', 'COUNT(id)', 'reviewsCount');
$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
$results = $query->getResult();
次に、Productエンティティに$reviewsCount
があります。 フィールドとカウントはそれにマップされます。これは、Doctrineメタデータで次のように列が定義されている場合にのみ機能することに注意してください。
/**
* @ORM\Column(type="integer")
*/
private $reviewsCount;
public function getReviewsCount()
{
return $this->reviewsCount;
}
これは、によって提案されたものです。集計フィールド
教義の文書。ここでの問題は、基本的にDoctrineにデータベースにreviews_count
という別の列があると思わせることです。 、それはあなたが望まないものです。したがって、これはその列を物理的に追加しなくても機能しますが、doctrine:schema:update
を実行した場合は その列を追加します。残念ながら、Doctrineは実際には仮想プロパティを許可していないため、別の解決策は、独自のカスタムハイドレーターを作成するか、loadClassMetadata
にサブスクライブすることです。 イベントを実行し、特定のエンティティ(または複数のエンティティ)が読み込まれた後、自分でマッピングを手動で追加します。
COUNT(r.id) AS reviewsCount
のようなことをする場合は注意してください その後、COUNT(id)
を使用できなくなります addFieldResult()
で 関数であり、代わりにエイリアスreviewsCount
を使用する必要があります その2番目のパラメータについて。
を使用することもできますResultSetMappingBuilder
結果セットマッピングを使用するための開始点として。
私の実際の提案は、余分なことをすべて行うのではなく、手動でこれを行うことです。基本的に、エンティティとスカラーの結果の両方を配列に返す通常のクエリを作成し、スカラーの結果をエンティティの対応するマッピングされていないフィールドに設定して、エンティティを返します。