Cara mengisi kolom aditif melalui GABUNG dengan Doktrin

Misalkan saya memiliki entitas dengan relasi ManyToOne (dengan EXTRA_LAZY) dan tentu saja kolom gabungan.

eg. Article (main entity) -> Author (external entity)

misalkan saya menambahkan bidang author_name ke Artikel yang TIDAK dipetakan ke ORM dan dalam konteks tertentu bidang ini harus berisi nilai article->author->name (biasanya tetap nol).

Ketika saya menanyakan daftar artikel, saya ingin mengisi secara otomatis nama_penulis artikel itu tanpa menerapkan pengambil yang melakukan pemilihan pada setiap elemen hasil kueri. Saya ingin Doctrine mengambil dan menghidrasi nilai itu dengan GABUNG sederhana di kueri asli...

Saya tidak ingin menyetel mode pengambilan ke EAGER untuk kinerja karena dalam proyek saya, Penulis adalah entitas yang sangat kompleks.

Apakah ini mungkin?

Terima kasih


person Alex    schedule 02.03.2017    source sumber
comment
Saya telah memeriksa semua anotasi Ajaran hari ini dan belum menemukan satu pun yang memungkinkan Anda melakukan hal itu.   -  person Ihor Burlachenko    schedule 09.03.2017


Jawaban (1)


Mungkin saya sudah menemukan solusinya. Tidak tahu apakah ini cara terbaik untuk melakukannya tetapi berhasil.

Saya telah menambahkan pengambil lapangan ke kelas utama

public getAuthorName() {
  return $this->author->name
}

dalam konteks saya pengambil ini hanya akan dipanggil oleh serializer dalam kondisi tertentu.

Dalam kode repositori saya, saya memiliki metode khusus (yang saya refactored sehingga metode apa pun dapat memanggilnya secara implisit) untuk memaksakan populasi bidang Artikel->penulis ketika ditanya. Metode ini cukup menggunakan pembuat kueri untuk menambahkan LEFT JOIN ke kelas Penulis dan untuk sementara menyetel FetchMode ke EAGER pada Artikel->penulis.

Pada akhirnya, metode repositori sederhana bisa jadi seperti ini

public findAllWithCustomHydration() {
    $qb = $this->createQueryBuilder('obj');
    $qb->leftJoin("obj.author", "a")
       -> addSelect("a"); //add a left join and a select so the query automatically retrive all needed values to populate Article and Author entities
    //you can chain left join for nested entities like the following
    //->leftJoin("a.address", "a_address")
    //-> addSelect("a_address");


    $q = $qb->getQuery()
              ->setFetchMode(Article::class, "author", ClassMetadata::FETCH_EAGER);
   //setFetchMode + EAGER tells Doctrine to prepopulate the entites NOW and not when the getter of  $article->author is called. 
   //I don't think that line is strictly required because Doctrine could populate it at later time from the same query result or maybe doctrine automatically set the field as EAGER fetch when a LEFT JOIN is included in the query, but i've not yet tested my code without this line.

    return $q->getResult();
}

Kekurangannya adalah Anda harus menyesuaikan setiap kueri atau lebih baik menggunakan DQL/SQL/QueryBuilder untuk setiap metode repo tetapi dengan pemfaktoran ulang yang baik, untuk kasus penyertaan sederhana, Anda dapat menulis metode umum yang menyuntikkan gabungan itu pada array field_name dasar.

Semoga ini bisa membantu dan tambahkan jawaban Anda jika Anda menemukan cara yang lebih baik.

PS. Saya telah menulis kode di atas dengan cepat karena sekarang saya tidak ada di buku catatan saya, semoga berhasil pada eksekusi pertama.

person Alex    schedule 12.03.2017