Dacă vă întrebați: "Ce este Yii?" verificați tutorialul meu anterior: Introducere în Cadrul Yii, care analizează beneficiile Yii și include o prezentare generală a schimbărilor din Yii 2.0, lansat în octombrie 2014.
În această programare cu seria Yii2, ghid direct cititorii în folosirea cadrului Yii2 pentru PHP. În tutorialul de astăzi, vă voi ajuta să folosiți maparea obiect-relațională Yii, cunoscută sub numele de ORM, pentru a lucra cu bazele de date. Se numește Active Record și este un aspect cheie al aplicațiilor de bază de programare eficientă în Yii.
Yii oferă modalități diferite de a lucra cu baza de date programabil, cum ar fi interogări directe și un constructor de interogări, dar folosind Active Record oferă un set complet de beneficii pentru programarea bazelor de date orientate obiect. Lucrarea dvs. devine mai eficientă, mai sigură, funcționează în cadrul arhitecturii controlerului vizual al modelului Yii și este portabilă dacă decideți să schimbați platformele de baze de date (de ex., MySQL în PostgreSQL).
Urmați-mă pe măsură ce detaliem elementele de bază ale Active Record în Yii.
Doar un memento, eu particip la comentariile de mai jos. Sunt interesat în special dacă aveți abordări diferite, idei suplimentare sau doriți să sugerați subiecte pentru tutoriale viitoare. Dacă aveți o sugestie de întrebare sau subiect, vă rugăm să postați mai jos. Puteți să mă contactați și pe Twitter @reifman direct.
Controlerul vizual al modelului Yii este unul dintre beneficiile sale principale. Active Record oferă o soluție orientată spre obiect pentru a lucra cu bazele dvs. de date, care este strâns integrată cu modelele Yii. Potrivit Wikipedia, termenul general Active Record a fost "numit de Martin Fowler în cartea sa din 2003 Modele de arhitectură de aplicații pentru întreprinderi."
Documentația Yii rezumă acest lucru în mod concis:
O clasă Active Record este asociată cu o tabelă de baze de date, o instanță Active Record corespunde unui rând din acel tabel și un atribut a unei instanțe Active Record reprezintă valoarea unei anumite coloane din rândul respectiv. În loc să scrieți instrucțiuni SQL prime, ați accesa atributele Active Record și apelați metode Active Record pentru a accesa și manipula datele stocate în tabelele bazei de date.
Integrarea modelării Active Record în Yii reprezintă o puternică forță a cadrului, dar este comună majorității cadrelor, cum ar fi Ruby on Rails.
Această abstractizare de la modele la tabele de baze de date permite cadrului să efectueze ridicarea grele a securității peste tot, de ex. ruperea interogărilor SQL de injectare.
Suportul Active Record de la Yii oferă de asemenea o portabilitate într-un număr de baze de date. Puteți schimba bazele de date fără a fi nevoie să schimbați o mulțime de cod:
yii2-Sphinx
extensieyii2-elasticsearch
extensieȘi următoarele baze de date NoSQL:
yii2-Redis
extensieyii2-MongoDB
extensieÎn episodul anterior, cum să programați cu Yii2: Lucrul cu baza de date și înregistrarea activă, am trecut prin crearea bazei dvs. de date, cum se conectează Yii la ea pentru fiecare sesiune, folosind o migrare pentru a crea tabele de baze de date și folosirea codului Gii schele generator) pentru a crea codul de model implicit. Dacă nu sunteți familiarizați cu niciunul dintre acestea, vă rugăm să consultați acest episod.
În acest episod, mă voi concentra mai mult pe folosirea Active Record în codul dvs..
În primul rând, permiteți-mi să revizuiesc modul de transformare a unui model Yii în metoda Active Record. Voi folosi un exemplu de model pe care l-am creat în seria Building your Startup. Această serie vă ghidează prin modul în care construiesc startup-ul meu, Planificatorul de întâlniri, în Yii2.
Voi folosi exemplul unui model simplu pe care l-am creat numit Lansare, care permite vizitatorilor paginii de pornire să ofere adresa lor de e-mail dacă doresc să fie anunțați atunci când produsul este în afara previzualizării și este complet publicat.
Utilizarea funcției Active Record cu un model este destul de simplă; observați clasa Launch extinde \ yii \ db \ ActiveRecord
:
Asta e.
Interogări privind clădirile
Să ne uităm la unele interogări comune de înregistrare activă.
Înregistrări individuale
Dacă aveți un ID de înregistrare, de multe ori dintr-un parametru de interogare de la un controler, este ușor să găsiți înregistrarea pe care o doriți:
funcția publică funcția Ceva ($ id) $ model = Lansare :: findOne ($ id);Acest lucru este identic cu:
$ model = Lansare :: find () -> unde (['id' => $ id]) -> one ();De asemenea, puteți extinde
-> în cazul în care
array cu mai multe câmpuri sau condiții booleene:$ model = Lansare :: find () -> unde (['id' => $ id, 'status' => Lansare :: ACTIVE_REQUEST]) (['id' => $ id) -> andWhere (['status' => Lansare :: ACTIVE_REQUEST]) -> sauWhere (['status' => Lansare :: FUTURE_REQUEST]) ...Înregistrări multiple
Iată un exemplu de a găsi toate înregistrările care se potrivesc cu un anumit
stare
sortate dupa$ id
:$ people = Lansare :: find () -> unde (['status' => Lansare :: STATUS_REQUEST]) -> orderBy ('id') -> all ();
-> Toate ();
găsește toate înregistrările în loc de numai unul. Variabila$ oameni
este returnat ca o serie de obiecte model. Alternativ, atunci când nu există condiții, puteți accesa toate înregistrările cu-> Findall ();
Returnează o matrice
Utilizarea
indexBy
returnează o serie de elemente indexate de lorid
:$ people = Lansare :: find () -> indexBy ('id') -> all ();Alternativ, puteți reveni la o matrice asociativă
-> AsArray ()
:$ people = Lansare :: find () -> asArray () -> all ();Notă: Documentația Yii spune: "În timp ce această metodă economisește memorie și îmbunătățește performanța, este mai aproape de stratul inferior de abstractizare DB și veți pierde majoritatea funcțiilor Active Record".
Numărătoare de înregistrări
Puteți reveni, de asemenea, doar la
numara
dintr-o interogare:$ count = Lansare :: find () -> unde (['status' => Lansare :: STATUS_REQUEST]) -> count ();Pe care o folosesc, numără foarte mult în Planificatorul de întâlniri pentru statistici, de exemplu; aflați mai multe în episodul nostru de tabloul de bord:
// calculate $ count_meetings_completed $ hd-> count_meetings_completed = Întâlnire :: find () -> unde (['status' => Întâlnire :: STATUS_COMPLETED]) -> andWhere ('created_at<'.$since)->numara();; // calcula $ count_meetings_expired $ hd-> count_meetings_expired = Întâlnire :: find () -> unde (['status' => Întâlnire :: STATUS_EXPIRED]) -> andWhere ('created_at<'.$since)->numara();; // calc $ $ count_meetings_planning $ hd-> count_meetings_planning = Întâlnire :: find () -> where ('status<'.Meeting::STATUS_COMPLETED)->andWhere ( "created_at<'.$since)->numara();; // calcula $ count_places $ hd-> count_places = Locul :: find () -> unde ('created_at>'. $ after) -> andWhere ('created_at<'.$since)->numara();Accesarea datelor
Odată ce ați interogat date, cum ar fi un model individual, este ușor să accesați datele ca un obiect model:
$ model = Lansare :: findOne ($ id); $ id = $ model-> id; $ email = $ model-> email;Eu deseori procesez array-uri în felul următor:
$ users = Utilizator :: findAll (); foreach ($ utilizatori ca $ u) $ id = $ u-> id; $ email = $ u-> email;Atribuiri masive
De asemenea, puteți atribui rapid o matrice unei înregistrări de model prin ActiveRecord:
$ valori = ['nume' => 'James', 'email' => '[email protected]',]; $ client = Client nou (); $ customer-> attributes = $ values; $ De client> Salvați ();Acest lucru este adesea folosit pentru stocarea datelor model după depunerea formularului:
dacă (isset ($ _ POST ['FormName'])) $ model-> atributele = $ _POST ['FormName']; dacă ($ model-> save ()) // handle successSau puteți folosi
-> Sarcină ()
pentru asta:dacă ($ model-> încărcați (Yii :: $ app-> request-> post ()) && $ model-> save ()) ...Generatorul de coduri de schelet Gii de la Yii este foarte bun la generarea de modele folosind ActiveRecord care fac multe pentru tine, de ex. modele, controlere, forme, opinii etc..
Salvarea datelor
După cum puteți vedea mai sus, salvarea datelor cu ajutorul funcției Active Record este ușoară. În acest exemplu, din documentația Yii, este creată și salvată o nouă înregistrare - și apoi o înregistrare este încărcată de id, iar actualizările sunt salvate:
// introduceți un nou rând de date $ customer = new Customer (); $ client-> nume = 'James'; $ client-> email = '[email protected]'; $ De client> Salvați (); // actualizați un rând existent de date $ client = Client :: findOne (123); $ client-> email = '[email protected]'; $ De client> Salvați ();Ștergerea înregistrărilor
Ștergerea unei înregistrări este chiar mai ușoară:
$ u = Utilizator :: FindOne (99); $ U-> șterge ();Actualizarea contoarelor
Yii oferă, de asemenea, incrementări incrementale. Să presupunem că un utilizator planifică o altă întâlnire și urmăresc numărul de utilizatori din tabelul de utilizatori:
$ u = Utilizator :: FindOne (99); $ U-> updateCounters ([ 'meeting_count' => 1]); // echivalează cu // UPDATE 'Utilizator' SET 'meeting_count' = 'meeting_count' + 1 WHERE 'id' = 99Relaţii
Conectarea tabelelor în indexuri este una dintre cele mai puternice capabilități ale Active Record. De exemplu, în Planificatorul de întâlniri, fiecare întâlnire poate avea 0 sau mai multe
MeetingPlaces
. Modelul Meeting.php definește o relativă ActiveQuery pentru aceasta:* @property MeetingPlace [] $ meetingPlaces / ** * @return \ yii \ db \ ActiveQuery * / funcția publică getMeetingPlaces () return $ this-> hasMany (MeetingPlace :: className (), ['meeting_id' => „]);Apoi, pot accesa toate locurile unei întâlniri cu
$ meetingPlaces
proprietate. Mai jos, încărc o întâlnire și o repet pe toatemeetingPlaces
destul de ușor ca și cum ar fi fost o construită serie de sub-obiecte:$ MTG = Meeting :: găsi () -> în cazul în care ([ 'id' => $ MEETING_ID]) -> unul (); foreach ($ mtg-> meetingPlaces ca $ mp) ...Desigur, acest lucru se bazează pe crearea unei chei străine atunci când creați tabelul în migrarea sa:
$ this-> createTable ('% meeting_place', ['id' => Schema :: TYPE_PK, 'meeting_id' => Schema :: TYPE_INTEGER. 'NOT NULL', 'suggested_by' => Schema :: TYPE_BIGINT. 'NOT NULL', 'status' => Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'created_at' => Schema :: TYPE_INTEGER. NULL ',' updated_at '=> Schema :: TYPE_INTEGER.' NOT NULL ',], $ tableOptions); $ this-> addForeignKey ('fk_meeting_place_meeting', 'meeting_place', 'meeting_id', 'meeting%', 'id', 'CASCADE', 'CASCADE');Ce urmeaza
Sper că acest lucru a oferit o introducere ușoară în ceea ce privește o minunată experiență a lui Active Record. De asemenea, include ciclurile de viață, tranzacțiile și blocarea, despre care aș putea scrie în viitor. Dacă doriți să avansați, Yii2 oferă două zone excelente pentru a afla mai multe în documentația sa: Yii2 Ghid pentru înregistrarea activă și Yii2 Active Record pentru specificațiile funcționale. Acestea sunt introduceri bine scrise.
Urmăriți tutorialele viitoare din programul de programare cu seria Yii2, deoarece continuăm să vă scufundăm în diferite aspecte ale cadrului. Puteți, de asemenea, doriți să verificați stația de construire a sistemului dvs. de pornire cu PHP.
Dacă doriți să știți când vine următorul tutorial Yii2, urmați-mă @reifman pe Twitter sau verificați pagina de instructor.
Link-uri conexe