Anda dapat memetakan hasil kolom tunggal ke bidang entitas - lihat kueri asli dan ResultSetMapping untuk mencapai ini. Sebagai contoh sederhana:
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();
Kemudian di entitas Produk Anda, Anda akan memiliki $reviewsCount
bidang dan hitungan akan dipetakan ke sana. Perhatikan bahwa ini hanya akan berfungsi jika Anda memiliki kolom yang ditentukan dalam metadata Doktrin, seperti:
/**
* @ORM\Column(type="integer")
*/
private $reviewsCount;
public function getReviewsCount()
{
return $this->reviewsCount;
}
Inilah yang disarankan oleh Bidang Agregat
Dokumentasi doktrin. Masalahnya di sini adalah bahwa Anda pada dasarnya membuat Doctrine berpikir Anda memiliki kolom lain di database Anda yang disebut reviews_count
, yang tidak Anda inginkan. Jadi, ini masih akan berfungsi tanpa menambahkan kolom itu secara fisik, tetapi jika Anda pernah menjalankan doctrine:schema:update
itu akan menambahkan kolom itu untuk Anda. Sayangnya Doctrine tidak benar-benar mengizinkan properti virtual, jadi solusi lain adalah dengan menulis hidrator kustom Anda sendiri, atau mungkin berlangganan loadClassMetadata
event dan secara manual menambahkan pemetaan sendiri setelah entitas (atau entitas) tertentu Anda dimuat.
Perhatikan bahwa jika Anda melakukan sesuatu seperti COUNT(r.id) AS reviewsCount
maka Anda tidak dapat lagi menggunakan COUNT(id)
di addFieldResult()
. Anda fungsi, dan sebagai gantinya harus menggunakan alias reviewsCount
untuk parameter kedua itu.
Anda juga dapat menggunakan ResultSetMappingBuilder
sebagai permulaan untuk menggunakan pemetaan kumpulan hasil.
Saran saya yang sebenarnya adalah melakukan ini secara manual alih-alih melalui semua hal tambahan itu. Pada dasarnya buat kueri normal yang mengembalikan entitas Anda dan hasil skalar ke dalam array, lalu atur hasil skalar ke bidang yang sesuai dan belum dipetakan pada entitas Anda, dan kembalikan entitas.