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