Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah mungkin menggunakan hasil fungsi SQL sebagai bidang dalam Doktrin?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. bagaimana mendapatkan variabel env dari buruh pelabuhan di file konfigurasi symfony yml

  2. MySQL di mana TIDAK DALAM array nama?

  3. JSON_QUOTE() – Cara Menghilangkan Karakter dalam String yang digunakan sebagai Nilai JSON di MySQL

  4. DATE_SUB() Contoh – MySQL

  5. 3 Cara untuk Mendeteksi jika String Cocok dengan Ekspresi Reguler di MySQL