Association table mapping design pattern in PHP

Design Patterns | Stefanescu Mihai | 2023-01-15

Acest pattern, association table mapping este un mod de a crea o relatie de tip many-to-many intre entitatile unei baze de date. Se foloseste in momentul in care ai 2 entitati intre care trebuie sa existe o relatie de tip many-to-many. In loc sa adaugam mai multe coloane pentru cele 2 entitati, facem o tabela noua care sa se ocupe de aceasta asociere.

Hai sa vedem cum ar putea functiona acest pattern.
- Sa pesupunem ca avem 2 entitati, "users" si "groups", fiecare user poate fi in mai multe grupuri, iar fiecare grup poate avea mai multi useri.
- In loc sa adaugam coloana group_id pe tabela users si o coloana user_id pe tabela de groups, o sa facem o tabela noua numita user_group.
- Tabela user_group va avea 2 campuri, user_id si group_id.
- Fiecare rand din tabela user_group reprezinta o singura asociere intre un user si un grup.
- De exemplu, daca user-ul cu id-ul 1 este un grupul cu id-ul 1 si in grupul cu id-ul 2, in tabela user_group o sa avem 2 inregistrari (1,1) si (1,2)

Acest design pattern iti permite sa creezi, citesti, modifici si stergi usor asocierile many-to-many, de asemenea, poti adauga si extra informatii legate de asociere, cum ar fi data creeri asocierii sau un rol al user-ului in grup.

De asemenea, ce este important de retinut este faptul ca folosind acest pattern vei fi nevoit sa te folosesti de un JOIN in query-ul de SQL pentru a scoate asocierea.

Mai jos am sa explic un exemplu al acestui pattern in PHP folosind PDO (PHP Data Objects) pentru a interactiona cu baza de date MySQL.

Care sunt pasii pe care trebuie sa ii urmam?

1. Facem o tabela noua de asociere a celor 2 entitati, precum user_group cu coloanele user_id si group_id
2. Pentru a adauga o noua asociere facem un insert cu asociere folosindu-ne de ID-urile din cele 2 entitati

$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'password'); $stmt = $pdo->prepare("INSERT INTO user_group (user_id, group_id) VALUES (:user_id, :group_id)"); $stmt->execute(['user_id' => 1, 'group_id' => 2]);

3. Pentru a prelua toate asocierile unui anumit user sau unui anumit grup trebuie sa facem un select pe tabela de asociere cu JOIN pe tabela de asociere

$stmt = $pdo->prepare("SELECT * FROM user_group JOIN groups ON user_group.group_id = groups.id WHERE user_id = :user_id"); $stmt->execute(['user_id' => 1]); $groups = $stmt->fetchAll();

4. Pentru a sterge o asociere, trebuie sa stergi inregistrarea din tabela de asocieri ce corespunde datelor dorite, atat din prima tabela, cat si din a doua.

$stmt = $pdo->prepare("DELETE FROM user_group WHERE user_id = :user_id AND group_id = :group_id"); $stmt->execute(['user_id' => 1, 'group_id' => 2]);

Acest exemplu al design pattern-ului association table mapping este unul simplist, el poate fi modificat conform necesitatii voastre de implementare.


Imi place ce faci aici
Daca iti place ce fac aici imi poti cumpara o cafea Buy Me a Coffee at ko-fi.com

Stefanescu Mihai
Programator de ~8 ani, am lucrat la proiecte din mai multe industrstrii, de la eCommerce la telecomunicatii la automatizari. In acest timp am folosi diferite tehnologii, de la PHP, MySQL, PostgreSql, RabbitMq, Redis, Memcached si altele.
       

Get in touch
Pentru nelamuriri, dubii, comentarii si chestii de pe suflet ne putem auzi pe Discord, Reddit sau poti deschide o discutie noua pe forum.

Posteaza un comentariu

Comentarii

Inca nu au fost postate comentarii, fii primul care posteaza un comentariu!

Club-ul este dedicat membrilor si ofera access la mai multe zone ale website-ului.

🗝ïļ Login 🌟 Register

🔖 Bookmarks ⊞
âœĻ Pentru a sustine aceasta comunitate am sa te rog sa te autentifici sau sa te inregistrezi!

🌊ïļ Discord ⊞

Folosim cookie-uri pentru a oferi functionalitatile critice ale aplicatiei Invata-Programare. Folosim cookie-uri si pentru a analiza traficul, pentru care e nevoie de consimtamantul dvs. explicit.

⮆ïļ