Cum se programează cu Yii2 ActiveRecord

Ce veți crea

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.

Ce este Recordul activ?

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:

  • MySQL 4.1 sau mai târziu
  • PostgreSQL 7.3 sau o versiune ulterioară
  • SQLite 2 și 3
  • Microsoft SQL Server 2008 sau o versiune ulterioară
  • CUBRID 9.3 sau mai târziu
  • Oracol
  • Sphinx: prin yii \ sphinx \ ActiveRecord, necesită yii2-Sphinx extensie
  • ElasticSearch: prin intermediul yii \ elasticsearch \ ActiveRecord, necesită yii2-elasticsearch extensie

Și următoarele baze de date NoSQL:

  • Redis 2.6.12 sau mai recent: prin yii \ redis \ ActiveRecord, necesită yii2-Redis extensie
  • MongoDB 1.3.0 sau mai recent: prin yii \ mongodb \ ActiveRecord, necesită yii2-MongoDB extensie

Învățați elementele de bază

Î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..

Declararea unei clase active de înregistrare într-un model

Î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 lor id:

$ 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 success

Sau 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' = 99 

Relaţ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 toate meetingPlaces 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

  • Cum să programați cu Yii2: Lucrul cu baza de date și înregistrarea activă (Envato Tuts +)
  • Yii2 Ghid pentru înregistrarea activă
  • Yii2 Specificație funcțională de înregistrare funcțională
  • Modul activ de înregistrare (Wikipedia)
  • Yii2 Developer Exchange, site-ul meu de resurse Yii2
Cod