Yii interogări relaționale

Înregistrare activă relațională

Am luat deja în considerare utilizarea Active Record (AR) pentru a selecta datele dintr-o tabelă de bază de date. În această secțiune, vă vom arăta cum să utilizați AR pentru a conecta mai multe tabele conectate și pentru a obține un set de date conexe. Înainte de a utiliza un AR relațional, este recomandat să setați constrângerile cheii străine pentru tabelele bazei de date. Acest lucru va asigura coerența și integritatea datelor stocate. Pentru claritatea exemplelor din această secțiune, vom folosi schema bazei de date prezentată în următoarea schemă de entitate-relație (ER).







Informații: Sprijinul pentru constrângerile cheie străine diferă în diferite DBMS-uri. SQLite 3.6.19 și versiunile anterioare nu acceptă restricții, dar le puteți declara totuși atunci când creați tabele. Motorul MyISAM MySQL nu acceptă chei externe.

1. Stabilirea relațiilor dintre clasele AR

Înainte de a utiliza AR pentru a efectua interogări relaționale, trebuie să stabilim legături între clasele AR. Relația dintre cele două clase AR depinde în mod direct de legăturile dintre tabelele de bază corespunzătoare. Din punctul de vedere al bazei de date, relația dintre tabelele A și B poate fi de trei tipuri: unu la mulți (de exemplu, tbl_user și tbl_post), unu-la-unu (de exemplu, tbl_user și tbl_profile) și mulți la mai mulți (de exemplu tbl_category și tbl_post). Există patru tipuri de linkuri în AR:
  • BELONGS_TO. dacă conexiunea dintre A și B este una-la-multe, atunci B aparține A (de exemplu, Postul aparține utilizatorului);
  • HAS_MANY. dacă conexiunea dintre tabelele A și B este una-la-multe, atunci A are o mulțime de B (de exemplu, utilizatorul are o mulțime de Post);
  • HAS_ONE. acesta este un caz special al HAS_MANY. unde A poate avea maximum un B (de exemplu, utilizatorul are un singur profil);
  • MANY_MANY. această relație corespunde tipului de comunicări de la mulți la mulți în baza de date. Deoarece multe DBMS-uri nu suportă direct acest tip de conexiune, este necesară o masă asociativă pentru a converti mai multe comunicări în relații unul-la-multe. În schema de bază de date a acestui obiectiv este tabelul tbl_post_category. În terminologia AR, relația MANY_MANY poate fi descrisă ca o combinație între BELONGS_TO și HAS_MANY. De exemplu, Post aparține mai multor categorii. și categoria are o mulțime de Post.
Există un al cincilea tip de conexiune special conceput pentru interogări statistice pe înregistrări conexe (cereri de agregare) - se numește STAT. Pentru mai multe informații, consultați Interogarea statistică. Legarea se face în interiorul metodei relations () a clasei CActiveRecord. Această metodă returnează o matrice cu o configurație a legăturii. Fiecare element al matricei reprezintă un link în următorul format:





în care varname - nume de conexiune, RelationType indică una dintre cele patru tipuri de obligațiuni, ClassName - denumirea AR-clasa asociate clasei și ForeignKey reprezintă una sau mai multe chei externe, care sunt utilizate pentru comunicare. În plus, puteți specifica o serie de parametri suplimentari, care vor fi discutate mai târziu. Următorul cod arată modul de stabilire a unei relații între clasele Utilizator și Post.

2. Executarea unei interogări relaționale

Cea mai simplă modalitate de a efectua o interogare relațională este de a folosi proprietatea relațională a unei clase AR. Dacă această proprietate este accesată pentru prima dată, va fi executată o interogare relațională care va conecta tabelele asociate și va lăsa numai datele corespunzătoare cheii primare a instanței AR actuale. Rezultatul interogării va fi stocat în proprietate ca o instanță (sau array de instanțe) a clasei asociate. Această abordare este cunoscută și ca încărcare leneșă, în care o interogare directă este executată numai în momentul primei accesări a obiectelor asociate. Mai jos este un exemplu de utilizare a acestei abordări:

În plus, puteți implementa descărcări nesăbuite lacomi. Pentru a face acest lucru, în loc de o listă simplă de nume de link-uri, trecem cu () numele de linkuri ordonate într-un mod ierarhic, ca în exemplul următor:

3. Interogarea relațională fără a obține modele similare

4. Parametrii de interogare relaționali

5. Eliminarea conflictelor de nume de coloane

Sfat: aliasul tabelului de comunicare este în mod prestabilit egal cu numele link-ului propriu-zis. Rețineți că atunci când se utilizează un link în celălalt, va fi utilizat numele ultimei. Numele conexiunii părinte nu va fi folosit ca prefix. De exemplu, link-ul "author.group" este "grup", nu "autor.group".

Puteți evita coliziunile aliaselor de masă prin setarea proprietății conexiunii alias.

6. Parametrii dinamici ai unei interogări relaționale

7. Performanța interogării relaționale

Pentru încărcarea lacomă, putem seta acest parametru dinamic:

8. Interogare statistică

9. Interogări relaționale cu grupuri de condiție numite

Într-o interogare relațională, grupurile de condiție numite pot fi utilizate în două moduri. Ele pot fi aplicate modelului de bază și modelelor aferente. Următorul cod ilustrează cazul aplicării lor pe modelul principal:

În versiunea 1.1.7, a devenit posibilă transferarea parametrilor în grupuri de condiții de comunicare numite. De exemplu, dacă Post are un grup numit de condiții evaluate. primind un record minim de rating, utilizați-l în utilizare, după cum urmează: Notă: înainte de versiunea 1.1.7 domenii numite aplicate Modele similare trebuie să fie descrise în CActiveRecord :: domenii. Prin urmare, ele nu pot fi parametrizate.

10. Întrebări relaționale cu cele trecute

Când utilizați prin intermediul, definiția conexiunii ar trebui să arate astfel:

HAS_MANY prin

HAS_MANY prin ER

Yii interogări relaționale

HAS_ONE prin

HAS_ONE prin ER

prin intermediul meu

prin intermediul poate fi folosit pentru un model conectat la un pod. În cazul nostru, acesta este un utilizator care învață alți utilizatori:

prin auto ER

Relațiile pentru acest caz sunt definite după cum urmează:







Articole similare

Trimiteți-le prietenilor: