Symfony Doctrine Self Referencing Relationship
Self referencing relationship adalah saat sebuah entity berelasi dengan entity yang sama, misal entity User dengan Entity User lagi, contoh kasus adalah hubungan User yang di-follow/mem-follow (ManyToMany) User lainnya, atau contoh kasus lainnya adalah seorang User merupakan atasan bagi banyak Users dan juga disaat yang sama merupakan bawahan dari seorang User lainnya (OneToMany).
Pada beberapa kasus hal ini bisa membuat bingung, supaya tidak bingung berulangkali mari kita buat sebuah catatan mengenai hal ini.
ManyToMany
Contoh kasus untuk ini adalah dengan bermodalkan entity User (dengan sebuah table `users` dan sebuah table `following` yang secara otomatis di-generate oleh Doctrine untuk membantu relationship) kita akan membuat fitur follower dan following. follower adalah adalah orang yang mengikuti dan following adalah orang yang diikuti.
- Si A following si B
- Berarti si A follower si B
Untuk mengimplementasikan hal ini maka kita perlu menambahkan property followers dan following pada entity User di User.php. Sementara properties tersebut akan terlihat seperti ini.
![]() |
Seorang user bisa memili banyak followers dan following banyak users lainnya. |
![]() |
Penyesuaian pada constructor untuk handle saat User di instance dengen perintah new (artinya references masih kosong semua ). |
Setup Relasi untuk Follower dan Following
![]() |
Relasi dengan doctrine annotation |
Set Getters untuk Follower dan Following
![]() |
Getters dengan return collections |
Generate Table Following dengan Migration
Generate migration file baru dengan mengecek perubahan dari User entitiy dengan perintah berikut:
./bin/console doctrine:migration:diff
Migrate file migration yang sebelumnya dihasilkan oleh proses diatas dengan perintah dibawah ini.
./bin/console doctrine:migration:migrate
Hasil dari proses diatas akan menghasilkan tabel sebagai berikut.
![]() |
Tabel yang dihasilkan. |
Hasil dari proses diatas mengeksekusi query sebagai berikut untuk membuat table following.
![]() |
Query dari hasil migrate diatas. |
Setup Button Follow dan UnFollow
![]() |
Follow dan Unfollow buttons |
Setup Controller FollowingController
Import / use berbagai macam libraries yang diperlukan, saya sendiri menggunakan VSCode dan import libraries macam ini dihandle dengan baik oleh IDE yang saya gunakan.
![]() |
Libraries/services yang di use. |
![]() |
Variable properties yang diset private. |

Selanjutnya buat methods dan routes nya untuk dapat melakukan follow dan unfollow.
Method dan Route untuk melakukan follow.

Method dan Route untuk melakukan unfollow.

Hasil Di Local Saya

ManyToOne dan OneToMany
Pada contoh kasus ini kita akan menggunakan istilah Upline dan Downline pada user, yang artinya setiap user akan memiliki user seorang boss/upline dan banyak bawahan/downline.
- Si A memiliki upline si B.
- Si C memiliki upline juga si B.
- Berarti si B memiliki downline yaitu si A dan C.
Bersambung untuk upline dan donwline...
Sumber
- https://symfony.com/doc/current/doctrine/associations.html#mapping-the-manytoone-relationship
- https://stackoverflow.com/questions/21480955/parent-child-relationship-with-a-single-entity-in-doctrine-2
- https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#one-to-one-self-referencing
Comments
Post a Comment