Работа с обекти за достъп до база данни (DAO), Окончателното ръководство за Yii 1

Обектите за достъп до данни (DAO) предоставят общ API за достъп до данни, съхранявани в различни СУБД. Това ви позволява лесно да промените използваната СУБД с всяка друга, без да се налага да променяте кода, който използва DAO за достъп до данни.

Yii DAO е добавка за PHP Data Objects (PDO) - разширение, което предоставя унифициран достъп до данни до много популярни СУБД като MySQL, PostgreSQL. Следователно, за да използвате Yii DAO, PDO разширението и подходящият PDO драйвер (например PDO_MYSQL) трябва да бъдат инсталирани за използваната база данни.

Yii DAO се състои от четири основни класа:

  • CDbConnection: Представлява връзка към база данни.
  • CDbCommand: представлява заявката към базата данни, която трябва да бъде изпълнена.
  • CDbDataReader: Представлява еднопосочен поток от редове с данни, върнати в отговор на заявка.
  • CDbTransaction: представлява транзакция на база данни.

След това ще илюстрираме използването на Yii DAO с различни примери.

1. Връзка с база данни ¶

За да установите връзка с базата данни, трябва да създадете екземпляр на класа CDbConnection и да го активирате. Допълнителна информация, необходима за свързване към базата данни (хост, порт, потребителско име, парола и т.н.), е посочена в DSN (Име на източник на данни). Ако възникне грешка при свързване към базата данни, ще бъде хвърлено изключение (например невалиден DSN или неправилно потребителско име/парола).

Форматът на DSN зависи от използвания PDO драйвер. Обикновено DSN се състои от името на PDO драйвера, последвано от двоеточие, последвано от опции за връзка, които съответстват на синтаксиса на връзката на използвания драйвер. | Повече ▼това може да се намери в документацията на PDO. По-долу са някои от основните DSN формати:

  • SQLite: sqlite:/path/to/dbfile
  • MySQL/MariaDB: mysql:host=localhost;dbname=testdb
  • PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
  • SQL Server: mssql:host=localhost;dbname=testdb
  • Oracle: oci:dbname=//localhost:1521/testdb

Тъй като CDbConnection наследява класа CApplicationComponent, можем да го използваме като компонент на приложение. За да направите това, трябва да конфигурирате db компонента в конфигурацията на приложението, както следва:

Сега можем да осъществим достъп до връзката с базата данни чрез Yii::app()->db. За да предотвратите автоматичното активиране на връзката, трябва да зададете стойността CDbConnection::autoConnect на false. Този метод ни дава възможност да използваме една и съща връзка с база данни навсякъде в кода.

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

След като връзката с базата данни е установена, можем да изпълняваме SQL заявки с помощта на CDbCommand. За да направите това, трябва да създадете екземпляр на класа CDbCommand, като извикате CDbConnection::createCommand(), указвайки SQL оператора:

Има два начина за изпълнение на SQL заявки с помощта на CDbCommand:

execute(): изпълнява INSERT, UPDATE и DELETE SQL заявки. Връща броя на засегнатите редове при успех.

query(): Изпълнява SQL заявки, които връщат набори от данни, като например SELECT заявки. При успех връща екземпляр на класа CDbDataReader, който предоставя достъп до получените данни. За удобство са внедрени и методи като queryXXX(), които връщат резултати директно.

Ако възникне грешка по време на изпълнение на SQL заявката, ще бъде хвърлено изключение.

3. Обработкарезултати от заявката ¶

След като CDbCommand::query() създаде екземпляр на класа CDbDataReader, можем да получим резултата от заявката ред по ред чрез повтаряне на извикванията на метода CDbDataReader::read(). Можете също да използвате CDbDataReader в foreach конструкции, за да получите данни ред по ред.

Забележка: Всички методи queryXXX(), за разлика от query(), връщат данни директно. Например методът queryRow() връща масив, съответстващ на първия ред от резултата от заявката.

4. Използване на транзакции ¶

В случай, че едно приложение изпълнява няколко заявки, всяка от които записва или чете нещо от базата данни, е важно да се уверите, че наборът от заявки е завършен изцяло, а не частично. В тази ситуация можете да използвате транзакции, които са екземпляри на класа CDbTransaction:

  • Начало на транзакцията.
  • Изпълнение на заявки на свой ред. В този момент всички промени в базата данни не са достъпни отвън.
  • Потвърждение на транзакцията. Ако транзакцията е успешна, тогава промените стават публично достъпни.
  • Ако възникне грешка по време на изпълнение на заявката, транзакцията се връща до първоначалното си състояние.

Тази последователност от действия може да се приложи, както следва:

5. Параметри на обвързване ¶

За да предотвратим SQL инжекции и да подобрим производителността при изпълнение на същия тип SQL заявки, можем да „подготвим“ SQL изрази, използвайки маркери за параметри (заместители), които ще бъдат заменени с реални стойности по време на процеса на свързване.

Маркерите на параметрите могат да бъдат наименувани (уникални маркери) или безименни (въпросителни знаци). За да замените маркерите с реални стойности, извикайте методите CDbCommand::bindParam() или CDbCommand::bindValue().Няма нужда да избягвате или цитирате стойностите на параметрите, използваният драйвер на базата данни ще направи всичко сам. Свързването на параметрите трябва да се извърши преди изпълнението на SQL заявката.

Методите bindParam() и bindValue() са много сходни. Единствената разлика е, че първият свързва параметъра с препратка към PHP променлива, докато вторият се свързва със стойност. За параметри, които представляват голямо количество данни, е по-добре да използвате метода bindParam() от гледна точка на производителността.

6. Свързване на полето ¶

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

7. Използване на префикси на таблици ¶

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

За да използвате префикс на таблица, задайте свойството CDbConnection::tablePrefix. След това в SQL изрази използвайте > за указване на имена на таблици, където TableName е името на таблицата без префикс. Например, ако базата данни съдържа таблица tbl_user, където tbl_ е префиксът на таблицата, тогава можем да използваме следния код, за да получим списък с потребители: