ПредишенСледващото

Построен на върха на ЗНП. Yii DAO (данни за достъп обект) предоставя обектно-ориентиран API за достъп до релационни бази данни. Това е основата за други, по-напреднали, методи достъп до базата данни на данни, включително и строител на заявката и активно записа.

При използване на Yii DAO, вие най-вече ще използва чисти SQL и PHP масиви. В резултат на това най-ефективният начин за достъп до базата данни. Въпреки това, тъй като SQL синтаксис може да бъде различна за различните бази данни, с помощта на Yii DAO ще трябва да положи допълнителни усилия, за да направим приложението не зависи от конкретна база данни.

Yii DAO на кутията поддържа следните бази данни:

Забележка: Новата версия на PHP 7 pdo_oci в момента съществува само под формата на изходния код. Използвайте инструкциите за съставяне на Общността.

Създаване на връзка с базата данни

За достъп до базата данни, трябва първо да се свърже с него, създаване на инстанция на класа Yii \ db \ връзка:

Тъй като често се налага на няколко места връзката с базата данни, обичайна практика е да го конфигурирате като компонент на молба:

Сега можете да получите достъп до свърже с базата данни с помощта на израза Yii :: $ АРР> db.

Съвет: Можете да настроите няколко компоненти за свързване, ако вашето приложение използва множество бази данни.

Когато конфигурирате връзката, трябва да не забравяйте да посочите името на източник на данни (DSN) чрез определяне на DSn. DSN формат е различен за различните бази данни. Допълнително описание се обърнете към PHP директорията. По-долу са няколко примера:

  • MySQL, MariaDB: MySQL: гостоприемник = Localhost; DBNAME = mydatabase
  • SQLite: SQLite: / път / до / база данни / файл
  • PostgreSQL: pgsql: гостоприемник = Localhost порт = 5432; DBNAME = mydatabase
  • CUBRID: cubrid: DBNAME = demodb гостоприемник = Localhost порт = 33000
  • MS SQL Server (чрез sqlsrv водача): sqlsrv: сървър = Localhost; База данни = mydatabase
  • MS SQL Server (чрез dblib водача): dblib: гостоприемник = Localhost; DBNAME = mydatabase
  • MS SQL Server (чрез MSSQL водача): MSSQL: гостоприемник = Localhost; DBNAME = mydatabase
  • Oracle: OCI: DBNAME = // Localhost: 1521 / mydatabase

Имайте предвид, че ако се свърже с базата данни чрез ODBC, трябва да посочите имот Yii \ db \ Connection :: driverName. Yii да се знае кои от типа използвана база данни. Например,

В допълнение към DSn на имоти. трябва да зададете потребителско име и парола. Вижте Yii \ db \ Connection, за да видите пълния списък на свойства.

Инфо: Когато на екземпляр връзките към базата данни, действителното свързване към базата данни е установено само когато първият SQL заявка или изрично извикване на метода отворен ().

Съвет: Понякога може да е необходимо да се изпълнят някои искания веднага след свързване към базата данни, за да се инициализира на околната среда променливи. Например, за да определи времевата зона или кодирането. Можете да направите това, като се регистрирате за събитието манипулатор в afterOpen конфигурационните приложение:

Изпълнение на SQL заявки

След създаването на копие на връзката, можете да изпълни SQL заявка с помощта на следните стъпки:

  1. Създаване на Yii \ db \ Command от заявката за SQL;
  2. настройки Snap (по избор);
  3. Обадете се на един от методите за изпълнение на SQL Yii \ db \ Command.

Следният пример показва различни начини за извличане на данни от пъпеш на базата данни:

Забележка: За да се запази точността на данните се изтеглят като низ, дори вида на терена в базата данни е цифров.

параметри на свързване

Когато създавате команда от SQL заявка с параметри, вие почти винаги трябва да се използва за обвързване параметри, за да се предотврати атаки чрез SQL инжекция. Например,

В SQL заявка, можете да вградите една или повече маркери (например: идентификационен номер в примера по-горе). Маркерите трябва да са с линия, започваща с двоеточие. На следващо място, трябва да се обадите на един от следните методи, за да се свързват стойности на параметрите:

  • bindValue (). свързване един параметър значение
  • bindValues ​​(). Свързването на няколко параметри, в един разговор
  • bindParam (). като bindValue (). но свързването се случва тук.

Следващият пример показва алтернативен начин за свързване параметри:

Свързването променливи реализират чрез подготвени запитвания. Като допълнение към предотвратяване атаки от SQL инжекция, тя увеличава производителността, тъй като искането се изготвя веднъж и след това изпълнява много пъти с различни параметри. Например,

От bindParam () поддържа задължителни параметри на връзката, следния код може да бъде написано, както следва:

Имайте предвид, че се сдружават знак променлива $ номер, преди да пуснете заявката, и след това да промените тази стойност преди всяко следващо изпълнение (често това се прави в една линия). по този начин извършват заявки могат да бъдат значително по-ефективни от изпълнението на заявката за всяка стойност на параметър.

Изпълнение Не-SELECT заявки

В методи queryXyz на (). описано в предишните части, наречени SELECT заявки за извличане на данни от базата данни. не се връщат данни за заявката, трябва да използвате метод Yii \ db \ командване :: изпълнение (). Например,

Метод Yii \ db \ Command :: изпълнение () връща броя на обработените редове SQL заявка.

За заявката за вмъкване, обновяване и изтриване, вместо за написването чист SQL, можете да се обадите на методите вмъкнете (). актуализация (). изтриване (). съответно, за създаването на тези SQL конструкции. Например,

Можете също така да се обадите batchInsert (), за да вмъкнете няколко реда в един разговор. Това е по-ефективно, отколкото да вмъкнете записи един по един:

Моля, имайте предвид, че тези методи създават само запитване. За да изпълни желанието му да се обадите на Execute ().

Защитна имената на таблици и колони

Когато пишете код, който е независим от базови данни, правото на екрана имена на таблици и колони е трудно, тъй като различните бази на правилата за проверка на данните са различни. За да се преодолее този проблем, можете да използвате следния синтаксис се използва в скрининг Yii:

  • [[Име Колона]]. Приложете име на колона в двойни скоби;
  • >. приложете името на таблицата в двойни скоби.

Yii DAO автоматично ще конвертира тези конструкции в SQL в правилно екраниран имена на таблици и колони. Например,

Използването Представка на таблиците

Ако повечето от вашите маси използва общ префикс в името, можете да използвате Yii DAO имот, за да определите префикс.

Първо изберете префикс маса през имот Yii \ db \ Connection :: $ tablePrefix:

След това в кода си, когато трябва да се отнасят до една маса, чието име съдържа префикса, използва синтаксисът>. процента символ ще бъде автоматично заменена с префикс маса, който сте посочили по време на конфигурацията на базата данни връзка. Например,

извършване на сделки

Когато извършвате няколко серии зависими въпроси, може да се наложи да ги увийте в сделка, за да се гарантира целостта на базата от данни. Ако някоя грешка възниква, запитвания, база данни се върне към състоянието, в което е бил преди извършване на запитвания.

Следният код показва типична употреба на сделката:

Кодът по-горе е еквивалентно долу. Разликата е, че в този случай имаме повече контрол върху обработката на грешка:

Забележка: в горния код за съвместимост с PHP 5.x и PHP 7.x използва два блока за улова. \ Изключение изпълнява интерфейс \ Може да се изхвърли интерфейс като се започне с PHP 7.0. Ако използвате само PHP 7 и по-късно, можете да преминете към блок \ изключение.

Когато се обаждате beginTransaction (). нова сделка ще бъде стартиран. Сделката представлява от един обект Yii \ db \ записва в променливата $ сделката сделката. След това, вашите заявки ще се провеждат в блока опитам. хване. Ако исканията са направени добре, извършване () метод се изпълнява. В противен случай, ще се появи изключение, и начин намаление на цените () се извиква за намаление на цените на промените, направени в провала на искане в рамките на една сделка.

Определяне на нивото на изолация

Yii подкрепя залагането [ниво на изолация] за вашите сделки. По подразбиране, когато стартирате ниво транзакция изолация ще се използва за създаване на база от данни. Можете да замените ниво на изолация по подразбиране, както е посочено по-долу:

Yii осигурява четири константи за най-често срещаните нива изолация:

В допълнение към използването на константите дадени по-горе, за да настроите нивото на изолация, можете да използвате и линията се поддържа от вашия СУБД. Така например, в PostgreSQL, можете да използвате Serializable САМО ЗА ЧЕТЕНЕ DEFERRABLE.

Имайте предвид, че някои бази данни позволяват да настроите нивото на изолация, само за цялата връзка. Следните транзакции ще получават същото ниво на изолация, дори и да не уточняват. С тази функция може да се наложи да настроите нивото на изолация за всички транзакции, за да се избегне ясно несъвместими настройки. По време на това писание, ние сме страдали от това ограничение само MSSQL и SQLite.

Забележка: SQLite поддържа само две нива на изолация, така че можете да използвате само за четене неусвоени и Serializable. Използването на други нива на изолация, ще доведе до изключение.

Забележка: PostgreSQL не позволява инсталирането на нивото на изолация преди началото на операцията, така че не можете да настроите нивото на изолация, само в началото на сделката. Можете да използвате Yii \ db \ транзакция :: setIsolationLevel () в този случай, след началото на операцията.

вложени транзакции

Ако вашата база данни поддържа точка на запис, можете да сложите на сделката, както следва:

Репликация и разделяне на четене и запис искания

Много бази данни поддържат репликация база данни за по-широк достъп на база данни и ще намали времето за реакция на сървъра. С база данни репликация, данните се копират от управляващото сървъри, за да роб сървъри. Всички вложки и актуализации трябва да се проведе на главния сървър, но четене може да се направи с подчинените сървъри.

За да се възползвате от репликация и деление постижимо да четат и пишат, трябва да конфигурирате компонент Yii \ db \ Connection, както е показано по-долу:

Горната конфигурация определя система с един главен и няколко подчинени. Един от подчинените ще бъдат свързани и да се използва за четене, докато капитанът ще бъде използван за достъп за запис. Това разделение на четене и писане ще се извършва автоматично от определената конфигурация. Например,

Инфо: Искане, отправено от Yii \ db \ Command :: изпълнение () се определя като заявка за записване, както и всички други заявки чрез един от "заявка" метод Yii \ db \ възприема като прочетени исканията командване. Можете да получите текущото състояние на връзката към сървъра приемник чрез $ db-> роба.

компонент на връзката поддържа балансиране на натоварването и срив на подчинените сървъри. Ако първото искане за четене, компонент за свързване на случаен принцип ще избере целевия сървър, и се опита да се свърже с него. Ако сървърът ще бъде "мъртъв", той ще се опита да се свърже с друг. Ако нито едно от подчинен сървър не е на разположение, ще се свърже с капитана. Ако конфигурирате състоянието на кеш сървър. липсата на сървърите могат да се съхраняват, така че да не трябва да се използва по време на предварително определен период от време.

Информация: В конфигурацията по-горе, времето за изчакване на връзката с цел сървъра е конфигуриран за 10 секунди. Това означава, че ако сървърът не отговори в рамките на 10 секунди, това ще се счита за "мъртъв". Можете да регулирате настройката на базата на настройките ви за околната среда.

Можете също да зададете някои основни и някои подчинени сървъри. Например,

Горната конфигурация определя две основни и четири подчинени сървъри. компонент на връзката поддържа балансиране на натоварването и срив между основните сървъри, както и между подчинените. Разликата е, че когато всеки един от основния сървър за да се свържете, ще бъдат изхвърлени.

Забележка: Когато използвате майстори имота, за да изберете една или повече първични сървъри, всички други свойства, за да персонализирате свързването към базата данни (.. Такива като DSn потребителско име парола) ще бъдат игнорирани компонент на връзката.

По подразбиране, сделката е съединение с основния сървър. И като част от сделката, всички операции на базата данни ще използват връзката с основния сървър. Например,

Ако искате да започнете сделка на сървъра на роб, трябва да се споменава изрично, както е показано по-долу:

Понякога може да се наложи да изпълнява заявка за четене чрез връзка с основния сървър. Това може да се постигне като се използва метод useMaster ():

Можете също така да зададете изрично $ db-> enableSlaves невярно, да насочи всички запитвания към връзката с капитана.

Работа с схемата на базата данни

Yii DAO предоставя набор от методи за управление на схема на база данни, като например създаване на нови таблици, колони, премахване от масата и т.н. Тези методи са описани по-долу:

могат да се използват тези методи, както е посочено по-долу:

Можете също така да получите описание на схемата на маса, като се обадите метод getTableSchema (). Например,

Методът се връща обект Yii \ db \ TableSchema. който съдържа информация за колоните на таблицата, първични ключове, външни ключове и т.н. Цялата тази информация се използва предимно за заявка строител и активен запис. За да ви помогне да напишете база данни независима код.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!