Totul despre activarea în versiunea yii 2

Clasa ActiveRecord din Yii este creată pentru a crea o interfață orientată pe obiecte pentru a accesa baza de date stocată. Structuri similare pot fi găsite acum în alte cadre mai moderne: Laravel, CodeIgniter, Smyfony și Ruby. Astăzi vom intra în implementarea versiunii Yii 2.0 și vă voi arăta câteva dintre cele mai utile elemente.

Modelul de clasă intro.

Yii ActiveRecord este o versiune îmbunătățită a bazei yii \ base \ Model (fundația arhitecturii Model-View-Controller). Acum voi explica rapid funcționarea celor mai importante funcții pe care ActiveRecord le-a moștenit de la Model:

Datele de afaceri sunt stocate în atribute. Aici există copii ale modelelor publice. Toate atributele pot fi atribuite într-o manieră în masă: atribuie orice matrice proprietăților atribute ale modelului. Aceasta funcționează deoarece componenta de clasă de bază (care este clasa de bază în întreaga versiune a Yii 2.0) implementează metoda __set (). care în clasa Model are un alt nume - setAttributes (). Același lucru se aplică extragerii: toate atributele pot fi preluate prin aplicarea proprietății atributelor. Din nou, acest atribut este, de asemenea, construit pe clasa Componentă, care utilizează __get (). identic cu atributul getAttributes () din clasa Model.

Modelele furnizează de asemenea atributul de etichetă, care este utilizat pentru afișarea obiectivelor, ceea ce facilitează procesul de utilizare a acestora în forme.

Datele trimise la modelul de intrare al utilizatorului trebuie să fie verificate pentru a vedea dacă acestea satisfac logica dvs. de afaceri. Acest lucru se poate face prin specificarea regulilor (). care trebuie să conțină cel puțin unul sau mai multe atribute de validare.

În mod implicit, numai atributele care au statutul de "protejat" (înseamnă că au reguli de validare definite pentru ele) pot fi atribuite în bloc.

Scenariile vă permit să schimbați modul în care datele sunt verificate și procesate.

Creați un model ActiveRecord.

Exemplul modelului ActiveRecord este un șir în tabelele bazei de date, deci avem nevoie de o bază de date. În acest articol, voi folosi modelul bazei de date exact așa cum se arată mai jos în imagine ca exemplu. Aceasta este cea mai simplă structură, care este utilizată doar în postările din blog. Autorii pot avea mai multe articole, care la rândul lor pot avea mai multe etichete (în esență un sistem ierarhic). Articolele sunt legate de etichete prin linkul N: M, deoarece vrem să demonstrăm legătura bazată pe articole a etichetelor. În tabelul "Articole" ne vom concentra atenția, deoarece are cel mai interesant set de legături.

Am folosit extensia Gii pentru a crea un model bazat pe baza de date și legăturile din ea. Aici puteți vedea ce sa întâmplat în tabelul Articole create de structura bazei de date atunci când apăsați o întreagă pereche de taste:

Piesa din programul prezentat mai sus arată care atribute sunt disponibile în fiecare exemplu. Rețineți că este datorită partițiilor relative (distribuții de clasă) pe care le puteți utiliza, de asemenea, proprietăți pentru date conexe: una care utilizează autori Autorii $ și un set folosind articolulStatele [] $ articlestags.

Funcția tableName () determină baza de date asociată modelului dat. Acest lucru vă permite să separați numele clasei de numele propriu-zis al tabelului.

rules () definește regulile de validare pentru model. Nu există scenarii de definire, există doar un set de reguli. El este destul de lizibil; Indică câmpurile care sunt necesare sau pe întregul dorit, un șir.

Și la sfârșitul funcției getAuthors () și getArticlestags () definesc relațiile acestui tabel cu alții.

Notă: "Am fost extrem de surprins să aflu că atributul" Format "a pierdut toate proprietățile, verificările și etichetele. Se pare că Gii nu acceptă ENUM. În plus, în MySQL numai PostgreSQL îl acceptă și, prin urmare, nu este implementat. "

Finalizarea modelului.

Poate că ați văzut că articolele de clasă generate au relațiile definite pentru cheia străină a mesei. Conexiunea N: M dintre articole și etichete nu poate fi creată automat, așa că trebuie să o facem manual.

Toate linkurile sunt returnate ca o instanță pentru yii \ db \ ActiveQuery. Pentru a determina relația dintre articole și etichete, va trebui să folosim ArticlesTags ca tabel obligatoriu. În ActiveQuery, aceasta se face prin definirea unui tabel. ActiveQuery în acest scop oferă 2 metode pe care le puteți utiliza:

• via () vă permite să utilizați linkurile existente pentru a determina cele actuale;

• viaTable () ajută la determinarea utilizării unui tabel dat pentru legături existente.

Metoda via () vă permite să utilizați relații deja definite în tabel. În exemplul nostru, totuși, tabelul ArticlesTags nu conține informații importante despre acest lucru, așadar folosesc metoda viaTable ().

Acum că am identificat toate legăturile, putem începe să folosim modelul.

Utilizarea modelului.

Voi crea rapid o bază de date completă manual.

Merită menționat faptul că codul de mai sus conține câteva ipoteze, pe care le voi explica acum:

• Rezultatul elementului logic save () nu este evaluat. Acest lucru nu este rațional, deoarece Yii va numi prima dată elementul validate () din clasă și numai atunci îl va stoca în baza de date. INSERT în baza de date nu ar trebui să fie efectuate în conformitate cu regulile de verificare a defecțiunilor.

• Este posibil să observați că atributele ID ale diferitelor instanțe sunt utilizate până când nu sunt specificate. Aceasta poate fi sigură deoarece salva () apelează datele INSERT și primește asignările de chei primare din baza de date și face valorile valorilor de proprietate ID valabile.

• $ article-> LastEdited este valoarea DateTime din baza de date. Vreau să introduc data și ora curente apelând funcția NOW () în SQL. Puteți face acest lucru folosind clasa de expresie, care vă permite să aplicați diverse expresii SQL în instanțele ActiveRecord.

Apoi puteți extrage articolul din baza de date din nou:

Funcții noi și avansate.

Anterior, nu au fost prezentate toate informațiile despre Yii ActiveRecord. Să facem povestea chiar mai interesantă și să luăm în considerare cele mai recente și modificate caracteristici ale versiunii Yii 2.0.

Yii 2.0 are capacitatea de a detecta atributele modificate. În ActiveRecord, acest lucru se numește atribute "murdare", deoarece acestea necesită actualizarea bazei de date. Această abilitate implicită vă permite să vedeți care dintre atributele au fost modificate în model și să acționați asupra datelor acestora. Când, de exemplu, atribuiți masiv toate atributele din formularul POST, dar doriți să selectați numai cele modificate de la acestea, faceți acest lucru:

ActiveRecord, fiind o extensie a modelului. implementează linia \ yii \ base \ Arrayable cu metoda lui toArray (). Datorită acestui fapt, puteți transforma rapid un model cu atribute într-un matrice. Există, de asemenea, unele extra frumos.

De obicei, atunci când apelați metoda toArray (), apelați funcția fields (). care convertește o anumită bucată de program într-o matrice. Un parametru opțional extins laArray () va apela suplimentar elementul extraFields (). dictează care domenii vor fi de asemenea incluse.

Aceste două metode ale grupului de câmp sunt implementate prin intermediul BaseActiveRecord. dar le puteți implementa în modelul dvs. prin configurarea ieșirii în metoda toArray ().

În exemplul meu, aș dori ca matricea extinsă să conțină toate etichetele articolului, separate de virgulă:

Și apoi a obține o matrice cu toate câmpurile:

Versiunea Yii 1.1 a implementat deja anumite evenimente în CActiveRecord. care sunt păstrate în versiunea Yii 2.0. ciclu de funcționare ActiveRecord în manualul Yii 2.0 demonstrează foarte bine a alerga eveniment folosind ActiveRecord. Toate aceste evenimente sunt declanșate de acțiunile normale din jur ale instanței ActiveRecord. Numele acestor evenimente sunt destul de evidente, astfel încât să puteți afla atunci când sunt declanșate: afterFind (), beforeValidate (), afterValidate (), beforeSave (), afterSave (), beforeDelete (), afterDelete ().

În exemplul meu, atributul LastEdited este adecvat pentru a demonstra utilizarea unui eveniment. Vreau să mă asigur că LastEdited afișează întotdeauna cele mai recente modificări ale articolului. Pot distribui acest lucru între două evenimente: beforeSave () și beforeValidate (). Modelul meu afișează LastEdited ca atribut obligatoriu, deci va trebui să folosim evenimentul beforeValidate (). Pentru a vă asigura că este într-o copie nouă a modelului.

Rețineți că atunci când lucrați cu toate aceste evenimente, trebuie să apelați managerul evenimentului părinte. Valoarea falsă (sau nimic) va fi returnată evenimentelor funcției până când acțiunea va înceta.

Comportamentul poate servi la creșterea funcționalității componentelor existente fără modificarea codurilor. De asemenea, poate răspunde unui eveniment din componenta la care a fost atașat. În Yii 2.0, există o serie de opțiuni de comportament disponibile:

• yii \ behaviors \ AttributeBehavior vă permite să specificați atributele care trebuie actualizate. De exemplu, puteți seta o valoare de atribut bazată pe o funcție de eveniment anonim BEFORE_INSERT;

• Yii \ comportamente \ BlameableBehavior face exact ceea ce ați sugerat: vina pe cineva. Puteți pune 2 atribute: createByAttribute și updatedByAttribute. care va fi setat pentru ID-ul curent al utilizatorului când se creează sau se actualizează un obiect;

• yii \ behaviors \ LoggableBehavior vă permite să creați automat o adresă URL bazată pe unul dintre atributele pentru altul;

• yii \ behaviors \ TimestampBehavior vă va permite să creați sau să actualizați automat timestamp-urile în createAtAttribute și updatedAtAttribute.

Ultimul lucru pe care vreau să îl ating este capacitatea de a utiliza automat tranzacțiile în model. Cu ajutorul cheilor externe, există și posibilitatea interogării bazei de date, ceea ce uneori provoacă un eșec. Dar, cu ajutorul tranzacției, această problemă poate fi evitată. Yii vă permite să specificați operațiunile pe care o tranzacție trebuie să le efectueze cu funcția transactions (). Rețineți că va trebui să returnați regula pentru SCENARIO_DEFAULT. dacă doriți ca această operație să fie efectuată în mod prestabilit:

concluzie:

Tag-uri: versiunea de Yii 2.0, ActiveRecord, principalele funcții ale ActiveRecord

Articole similare