Construit peste DOP. Yii DAO (Obiecte de acces de date) furnizează un API orientat pe obiecte pentru a accesa bazele de date relaționale. Aceasta este baza altor metode de accesare a bazelor de date, inclusiv constructorul de interogări și înregistrarea activă.
Când utilizați Yii DAO, veți folosi în principal servere SQL și PHP pure. Ca rezultat, aceasta este cea mai eficientă modalitate de a accesa bazele de date. Cu toate acestea, deoarece sintaxa SQL poate diferi pentru diferite baze de date utilizând Yii DAO, va trebui să depuneți eforturi suplimentare pentru a face aplicația independentă de baza de date particulară.
Yii DAO din casetă acceptă următoarele baze de date:
Notă: Noua versiune a pdo_oci pentru PHP 7 există în prezent doar sub forma unui cod sursă. Utilizați instrucțiuni comunitare pentru compilare.
Crearea unei conexiuni baze de date
Pentru a accesa baza de date, trebuie mai întâi să vă conectați prin crearea unei instanțe de yii \ db \ Connection:
Deoarece conectarea la o bază de date este adesea necesară în mai multe locuri, este o practică obișnuită să o configurați ca o componentă a aplicației:
Acum puteți accesa conexiunea la baza de date utilizând expresia Yii :: $ app-> db.
Sfat: Puteți configura mai multe componente de conexiune dacă aplicația dvs. utilizează mai multe baze de date.
Când configurați o conexiune, trebuie să specificați numele sursei de date (DSN) prin parametrul dsn. Formatul DSN diferă pentru diferite baze de date. Vedeți referința PHP pentru mai multe informații. Iată câteva exemple:
- MySQL, MariaDB: mysql: host = localhost; dbname = baza mea de date
- SQLite: sqlite: / path / to / bază de date / fișier
- PostgreSQL: pgsql: host = localhost; port = 5432; dbname = adresa mea de date
- CUBRID: cubrid: dbname = demodb; gazdă = localhost; port = 33000
- MS SQL Server (prin driverul sqlsrv): sqlsrv: Server = localhost; Database = mydatabase
- MS SQL Server (prin intermediul driverului dblib): dblib: host = localhost; dbname = mydatabase
- MS SQL Server (prin intermediul driverului mssql): mssql: host = localhost; dbname = mydatabase
- Oracle: oci: dbname = // localhost: 1521 / mydatabase
Rețineți că, dacă vă conectați la baza de date prin intermediul ODBC, trebuie să specificați Yii proprietate \ db \ Connection :: driverName. astfel încât Yii știe ce tip de bază de date este folosit. De exemplu,
În plus față de proprietatea dsn. trebuie să specificați numele de utilizator și parola. Consultați conexiunea yii \ db \ Connection pentru a vedea lista completă a proprietăților.
Info: Când se creează o instanță de conexiune la baza de date, conexiunea reală la baza de date va fi setată numai când se execută prima interogare SQL sau când metoda open () este apelată explicit.
Sfat: Uneori poate fi necesar să se execute câteva interogări imediat după conectarea la baza de date, pentru a inițializa variabilele de mediu. De exemplu, pentru a seta fusul orar sau codarea. Puteți face acest lucru prin înregistrarea unui handler pentru evenimentul afterOpen în configurația aplicației:
Executarea interogărilor SQL
După crearea instanței conexiunii, puteți executa interogarea SQL urmând acești pași:
- Creați comanda yii \ db \ din interogarea SQL;
- Parametrii de legare (opțional);
- Apelați una dintre metodele de executare a SQL din comanda yii \ db \.
Următorul exemplu prezintă diferite moduri de a obține date din baza de date:
Notă: Pentru a păstra precizia, datele sunt preluate ca rânduri, chiar dacă tipul de câmp din baza de date este numeric.
Parametrii legați
Când creați o comandă dintr-o interogare SQL cu parametri, aproape întotdeauna trebuie să utilizați legarea parametrilor pentru a preveni atacurile prin injecție SQL. De exemplu,
Într-o interogare SQL, aveți posibilitatea să încorporați una sau mai multe jetoane (de exemplu: id în exemplul de mai sus). Marcatorii trebuie să fie un șir începând cu un colon. Apoi, trebuie să apelați una dintre următoarele metode pentru a lega valorile parametrilor:
- bindValue (). legarea unui parametru de valoare
- bindValues (). legarea mai multor parametri într-un singur apel
- bindParam (). se pare ca bindValue (). dar legarea este prin referință.
Următorul exemplu prezintă un mod alternativ de legare a parametrilor:
Legarea variabilelor este implementată prin intermediul cererilor pregătite. În plus față de prevenirea atacurilor prin injecție SQL, aceasta crește performanța, deoarece cererea este pregătită o dată și apoi executată de mai multe ori cu parametri diferiți. De exemplu,
Deoarece bindParam () suporta legarea parametrilor prin referință, următorul cod poate fi scris după cum urmează:
Rețineți că legați $ id-ul la variabila înainte de a executa interogarea și apoi modificați această valoare înainte de fiecare execuție ulterioară (adesea efectuată într-o buclă). Rularea interogărilor în acest fel poate fi mult mai eficientă decât executarea unei interogări pentru fiecare valoare a parametrului.
Executarea interogărilor neselectate
În metodele queryXyz (). descrise în secțiunile anterioare, interogările SELECT sunt solicitate pentru a prelua date din baza de date. Pentru interogări care nu returnează date, trebuie să utilizați metoda yii \ db \ Command :: execute (). De exemplu,
Metoda yii \ db \ Command :: execute () returnează numărul de rânduri procesate de interogarea SQL.
Pentru interogările INSERT, UPDATE și DELETE, în loc să scrieți SQL pur, puteți apela metodele insert (). actualizare (). șterge (). respectiv, pentru a crea construcțiile SQL specificate. De exemplu,
De asemenea, puteți apela batchInsert () pentru a insera mai multe rânduri într-un singur apel. Acest lucru este mai eficient decât introducerea înregistrărilor pe rând:
Rețineți că metodele de mai sus creează doar o interogare. Pentru a executa aceasta, trebuie să apelați execute ().
Nume de ecran pentru tabele și coloane
Când scrierea de cod, independent de datele de bază, dreptul de a ecran numele tabelelor și coloanelor este dificilă, deoarece diferite baze de date reguli de screening sunt diferite. Pentru a depăși această problemă, puteți utiliza următoarea sintaxă de evadare folosită în Yii:
- [[numele coloanei]]. includeți numele coloanei în paranteze pătrate;
- >. includeți numele mesei în paranteze duble.
Yii DAO va converti automat astfel de constructe în SQL în nume de coloane și nume de coloane evadate corespunzător. De exemplu,
Utilizând prefixele de tabelă
Dacă majoritatea tabelelor dvs. utilizează un prefix comun în nume, puteți utiliza proprietatea Yii DAO pentru a specifica prefixul.
Mai întâi, specificați prefixul tabelului din proprietatea yii \ db \ Connection :: $ tablePrefix:
Apoi, în cod, când trebuie să trimiteți un tabel al cărui nume conține un astfel de prefix, utilizați sintaxa>. Simbolul procentual va fi automat înlocuit cu prefixul de tabelă pe care l-ați specificat în timpul configurării conexiunii bazei de date. De exemplu,
Executarea tranzacțiilor
Când efectuați mai multe interogări dependente în ordine, este posibil să fie necesar să le înfășurați într-o tranzacție pentru a vă asigura integritatea bazei de date. Dacă există o eroare în oricare dintre solicitări, baza de date va reveni la starea care a fost înainte ca cererile să fie executate.
Următorul cod arată utilizarea tipică a tranzacțiilor:
Codul de mai sus este echivalent cu cel de mai jos. Diferența este că, în acest caz, obținem mai mult control asupra procesării erorilor:
Notă: în codul de mai sus, din motive de compatibilitate cu PHP 5.x și PHP 7.x, sunt utilizate două blocuri de captură. \ Exception implementează interfața \ Throwable din PHP 7.0. Dacă utilizați numai PHP 7 și mai târziu, puteți săriți blocul cu \ Exception.
Când apelați metoda beginTransaction (). o nouă tranzacție va fi inițiată. Tranzacția este reprezentată de obiectul yii \ db \ Transaction stocat în variabila de tranzacție $. Apoi, cererile vor fi executate în blocul de încercare. captura. Dacă cererile au succes, metoda commit () va fi executată. În caz contrar, excepția va fi aruncat, și rollback () metoda este numit pentru o derulare înapoi a modificărilor aduse la eșecul unei cereri în cadrul unei tranzacții.
Specificarea nivelului izolației
Yii acceptă configurarea [nivelului de izolare] pentru tranzacțiile dvs. În mod implicit, când începe tranzacția, va fi utilizat nivelul de izolare configurat în baza de date. Puteți suprascrie nivelul de izolare implicit după cum urmează:
Yii oferă patru constante pentru cele mai comune niveluri de izolare:
În plus față de utilizarea constantelor de mai sus pentru a specifica nivelul de izolare, puteți utiliza și șiruri de caractere suportate de DBMS-ul dvs. De exemplu, în PostgreSQL, puteți utiliza SERIALIZABLE READ ONLY DEFERRABLE.
Rețineți că unele DBMS vă permit să configurați nivelul de izolare numai pentru întreaga conexiune. Următoarele tranzacții vor primi același nivel de izolare, chiar dacă nu îl specificați. Când utilizați această funcție, este posibil să fie necesar să setați nivelul de izolare pentru toate tranzacțiile pentru a evita setările în mod explicit în conflict. În momentul acestei scrieri, numai MSSQL și SQLite au suferit de această limitare.
Notă: SQLite acceptă numai două nivele de izolare, astfel încât să puteți utiliza numai CITIȚI UNCOMMITTED și SERIALIZABLE. Utilizarea altor niveluri de izolare va duce la o excepție.
Notă: PostgreSQL nu permite instalarea nivelului de izolație înainte de începerea tranzacției, astfel încât să nu se poate seta nivelul de izolare doar la începutul tranzacției. Puteți folosi yii \ db \ Transaction :: setIsolationLevel () în acest caz după începerea tranzacției.
Tranzacții născute
Dacă sistemul dvs. DBMS suportă Savepoint, puteți să depozitați tranzacțiile după cum se arată mai jos:
Replicarea și partajarea cererilor de citire și scriere
Multe DBMSs suportă replicarea bazei de date pentru o disponibilitate mai bună a bazei de date și timpi de răspuns mai rapizi ai serverului. Cu replicarea bazei de date, datele sunt copiate de la serverele principale la serverele slave. Toate inserările și actualizările trebuie să aibă loc pe serverul principal, deși lectura poate fi făcută și din servere slave.
Pentru a profita de beneficiile replicării și a obține separarea citirii și scrierii, trebuie să configurați componenta yii \ db \ Connection după cum urmează:
Configurația de mai sus definește un sistem cu un master și mai mulți subordonați. Unul dintre sclavi va fi conectat și utilizat pentru citire, în timp ce maestrul va fi folosit pentru cererile de scriere. Această separare a citirii și scrisului se va face automat cu configurația specificată. De exemplu,
Info: Cerere făcută de Yii \ db \ command :: executa () sunt determinate ca o cerere de scriere, precum și toate celelalte cereri printr-una dintre „interogare“ metoda Yii \ db \ command percepute ca cererile de citire. Puteți obține starea conexiunii curente la serverul slave prin intermediul programului $ db-> slave.
Componenta Connection suportă echilibrarea încărcării și cedarea erorii pentru serverele slave. Când se execută prima solicitare de citire, componenta Connection selectează aleator serverul slave și încearcă să se conecteze la acesta. Dacă serverul este "mort", acesta va încerca să se conecteze la celălalt. Dacă nici unul dintre serverele slave nu este disponibil, se va conecta la master. Dacă configurați cache-ul de stare a serverului. nedisponibilitatea serverelor poate fi stocată astfel încât să nu fie utilizată pentru o anumită perioadă de timp.
Info: În configurația de mai sus, timpul de conectare la serverul slave este configurat timp de 10 secunde. Aceasta înseamnă că dacă serverul nu răspunde în 10 secunde, acesta va fi considerat "mort". Puteți ajusta acest parametru în funcție de setările de mediu.
De asemenea, puteți configura mai multe servere de bază și mai multe servere slave. De exemplu,
Configurația de mai sus definește două servere principale și patru slave. Componenta Connection suportă echilibrarea încărcării și întreruperea sarcinii între serverele primare, precum și între subordonați. Diferența este că atunci când nici unul dintre serverele majore nu se poate conecta, o excepție va fi aruncată.
Notă: Când utilizați proprietatea master pentru a configura una sau mai multe servere primare, toate celelalte proprietăți pentru configurarea unei conexiuni la baza de date (cum ar fi numele de utilizator, parola) vor fi ignorate de componenta Connection.
Implicit, tranzacțiile utilizează o conexiune la serverul principal. În cadrul tranzacției, toate operațiile bazei de date vor folosi conexiunea la serverul principal. De exemplu,
Dacă doriți să începeți o tranzacție pe un server slave, trebuie să specificați acest lucru în mod explicit, după cum se arată mai jos:
Uneori este posibil să fie necesar să executați o solicitare de citire printr-o conexiune la serverul principal. Acest lucru se poate realiza folosind metoda useMaster ():
De asemenea, puteți seta în mod explicit $ db-> enableSlaves la false pentru a direcționa toate cererile la conexiunea la expert.
Lucrul cu schema bazei de date
Yii DAO oferă un întreg set de metode pentru gestionarea unei scheme de baze de date, cum ar fi crearea de tabele noi, ștergerea de coloane dintr-un tabel etc. Aceste metode sunt descrise mai jos:
Aceste metode pot fi utilizate după cum urmează:
De asemenea, puteți obține o descriere a schemei de tabele prin apelarea metodei getTableSchema (). De exemplu,
Metoda va returna obiectul yii \ db \ TableSchema. care conține informații despre coloanele din tabel, cheile primare, cheile străine etc. Toate aceste informații sunt folosite în principal pentru constructorul de interogări și înregistrarea activă. Pentru a vă ajuta să scrieți cod independent de baza de date.