Adathozzáférési objektumok (dao) - adatbázisok használata - átfogó útmutató a yii 2-re

Az OEM felépítése. A Yii DAO (Data Access Objects) objektumorientált API a relációs adatbázisok eléréséhez. Ez az alapja az adatbázisok elérésének más, fejlettebb módszereinek, beleértve a lekérdezéskészítőt és az aktív rekordot.

Yii DAO használata esetén többnyire tiszta SQL és PHP tömböket használsz. Ennek eredményeképpen ez a leghatékonyabb módja az adatbázisok elérésének. Mivel azonban az SQL szintaxis különbözhet a különböző adatbázisokban a Yii DAO használatával, külön erőfeszítéseket kell tennie annak érdekében, hogy az alkalmazás független legyen az adott adatbázistól.

A Yii DAO a dobozból támogatja a következő adatbázisokat:

Megjegyzés: A PHP 7 új pdo_oci verziója jelenleg csak forráskód formájában létezik. Használja a közösségi utasításokat a fordításhoz.

Adatbázis-kapcsolat létrehozása

Az adatbázis eléréséhez először csatlakozni kell hozzá, hozzon létre egy yii \ db \ Connection osztály példányát:

Mivel több helyen is szükség van egy adatbázisra való csatlakozásra, általános gyakorlat az alkalmazás összetevőjének konfigurálása:

Mostantól az Yii :: $ app-> db kifejezéssel elérheti az adatbázishoz való kapcsolatot.

Tipp: Több kapcsolati összetevő konfigurálható, ha az alkalmazás több adatbázisot használ.

A kapcsolat beállításakor meg kell adnia az adatforrás nevét (DSN) a dsn paraméteren keresztül. A DSN formátum különbözik a különböző adatbázisoknál. További információért lásd a PHP hivatkozást. Íme néhány példa:

  • MySQL, MariaDB: mysql: host = localhost; dbname = mydatabase
  • Sqlite: / path / to / database / fájl
  • PostgreSQL: pgsql: host = localhost; port = 5432; dbname = mydatabase
  • CUBRID: kölyök: dbname = demodb; host = localhost; port = 33000
  • MS SQL Server (sqlsrv illesztőprogramon keresztül): sqlsrv: Server = localhost; Adatbázis = mydatabase
  • MS SQL Server (dblib driver segítségével): dblib: host = localhost; dbname = mydatabase
  • MS SQL Server (mssql illesztőprogramon keresztül): mssql: host = localhost; dbname = mydatabase
  • Oracle: oci: dbname = // localhost: 1521 / mydatabase

Ne feledje, hogy ha egy adatbázisra ODBC-n keresztül csatlakozik, meg kell adnia a yii \ db \ Connection :: driverName tulajdonságot. így Yii tudja, hogy milyen típusú adatbázist használ. Például,

A dsn tulajdonság mellett. meg kell adnia a felhasználónevet és a jelszót. Tekintse meg a yii \ db \ Connection parancsot a teljes tulajdonságok listájának megtekintéséhez.

Info: Amikor egy kapcsolati példányt hoz létre az adatbázisba, akkor az aktuális adatbázis-kapcsolatot csak az első SQL lekérdezés végrehajtásakor vagy a nyílt () metódus kifejezetten hívja meg.

Tipp: Néha előfordulhat, hogy bizonyos lekérdezéseket azonnal végre kell hajtani az adatbázisba való bekapcsolás után, a környezeti változók inicializálására. Például az időzóna vagy a kódolás beállításához. Ezt úgy teheti meg, ha regisztrál egy kezelőt az afterOpen eseményre az alkalmazás konfigurációjában:

SQL lekérdezések végrehajtása

A kapcsolatpéldány létrehozása után az SQL lekérdezés végrehajtása a következő lépésekkel végezhető el:

  1. Hozz létre yii \ db \ Command parancsot az SQL lekérdezésből;
  2. Kötési paraméterek (opcionális);
  3. Hívja az SQL egyik végrehajtási módját a yii \ db \ Command-ból.

Az alábbi példa az adatbevitel különböző módjait mutatja be:

Megjegyzés: A pontosság megőrzése érdekében az adatokat sorokként fogják lekérni, még akkor is, ha a mezőtípus az adatbázisban numerikus.

Bind paraméterek

Amikor létrehoz egy parancsot egy SQL lekérdezés paraméterekkel, akkor szinte mindig a paraméterek összerendelését kell használnia a támadások SQL injektálással történő megakadályozására. Például,

Egy SQL lekérdezésbe beágyazhat egy vagy több tokeneket (például: id a fenti példában). A jelölőknek kettősponttal kezdődő karakterláncnak kell lenniük. Ezután az értékeket a következő paraméterekhez kell kötni:

  • bindValue (). egy paraméter értékének megkötése
  • bindValues ​​(). több paramétert köt össze egy hívásban
  • bindParam (). Úgy néz ki, mint a bindValue (). de a kötés hivatkozásként szolgál.

Az alábbi példa a paraméterek összerendelésének alternatív módját mutatja:

A változó kötődést az elkészített kéréseken keresztül hajtják végre. Az SQL injektálással szembeni támadások megakadályozása mellett ez növeli a teljesítményt, mivel a kérelmet egyszer elkészíti, majd többször végrehajtja különböző paraméterekkel. Például,

Mivel a bindParam () referenciaként támogatja a paraméterek összerendelését, a következő kódot a következőképpen lehet írni:

Ne feledje, hogy a lekérdezés végrehajtása előtt megköti a $ id-et a változóhoz, majd módosítsa ezt az értéket minden további végrehajtás előtt (gyakran egy hurokban). A lekérdezések futása sokkal hatékonyabb lehet, mint minden paraméterérték lekérdezésének futtatása.

Nem SELECT lekérdezések végrehajtása

A queryXyz () függvényekben. az előző szakaszokban leírtak szerint a SELECT lekérdezések az adatbevitel adatainak lekérdezésére szolgálnak. Azoknál a lekérdezéseknél, amelyek nem adnak vissza adatokat, használnia kell a yii \ db \ Command :: execute () metódust. Például,

A yii \ db \ Command :: execute () módszer visszaadja az SQL lekérdezés által feldolgozott sorok számát.

Az INSERT, az UPDATE és a DELETE lekérdezések helyett a tiszta SQL írás helyett hívhat be beszúrási () metódusokat. frissítés (). töröl (). hogy létrehozzák a megadott SQL konstrukciókat. Például,

A batchInsert () hívást több hívásos sorba is beillesztheti. Ez hatékonyabb, mint a rekordok egyenként történő beillesztése:

Ne feledje, hogy a fenti módszerek csak lekérdezést hoznak létre. Végrehajtásához meg kell hívnia a execute () parancsot.

A táblák és oszlopok képernyőnevei

Ha az adatbázistól független kódot írunk, elég nehéz megnevezni az asztal és az oszlop nevét, mert a különböző szűrési szabályok eltérőek. A probléma megoldásához használhatja a Yii-ben használt következő escape szintaxist:

  • [[oszlopnév]]. csatolja az oszlop nevét kettős szögletes zárójelben;
  • >. csatolja a táblázat nevét kettős göndör zárójelben.

A Yii DAO automatikusan átalakítja az ilyen konstrukciókat az SQL-ből megfelelően elveszett táblázat- és oszlopnevekké. Például,

Táblázat előtagok használata

Ha a táblák többsége közös előtagot használ a névben, akkor a Yii DAO tulajdonság segítségével megadhatja az előtagot.

Először adja meg a yii \ db \ Connection :: $ tablePrefix tulajdonság táblázat előtagját:

Ezután a kódban, ha olyan táblázatot szeretne hivatkozni, amelynek neve ilyen előtagot tartalmaz, használja a szintaxist>. A százalékos szimbólum automatikusan helyettesíthető az adatbázis-kapcsolat konfigurációjában megadott táblázati előtaggal. Például,

Tranzakciók végrehajtása

Ha egymás után több függő lekérdezést hajt végre, szükség lehet arra, hogy egy tranzakcióban csomagolja be őket az adatbázis integritásának biztosítása érdekében. Ha bármelyik kérelemben hiba történik, akkor az adatbázis vissza fog térni a kérések végrehajtását megelőző állapotba.

A következő kód mutatja a tranzakciók tipikus használatát:

A fenti kód megegyezik az alábbiakkal. A különbség az, hogy ebben az esetben nagyobb ellenőrzést kapunk a hibakezelés felett:

Megjegyzés: a fenti kódban a PHP 5.x és a PHP 7.x kompatibilitás érdekében két fogási blokkot használnak. \ Exception implementálja a \ Throwable felületet a PHP 7.0-ból. Ha csak a PHP 7-es vagy újabb verziót használja, akkor a blokkot kihagyhatja a \ Exception lehetőséggel.

Amikor a startTransaction () metódust hívja. egy új ügylet indul. A tranzakciót a $ transaction változón tárolt yii \ db \ Transaction objektum képviseli. Ezután a kérések végrehajtásra kerülnek a próbablokkban. fogni. Ha a kérelmek sikeresek, a commit () módszer végrehajtásra kerül. Ellenkező esetben kivételt fognak adni, és a rollBack () módot visszahívják a tranzakció sikertelen lekérdezése előtt végrehajtott módosítások visszavonására.

A szigetelés szintjének meghatározása

A Yii támogatja a tranzakciók [elkülönítési szintjének] beállítását. Alapértelmezés szerint, amikor a tranzakció elindul, az adatbázisban beállított elkülönítési szint kerül felhasználásra. Az alapértelmezett elszigetelési szintet felülírhatja az alábbiak szerint:

Az Yii négy állandót biztosít a legelterjedtebb elszigetelési szintekhez:

Amellett, hogy a fenti állandókat az elkülönítési szint megadására használjuk, használhatjuk a DBMS által támogatott karakterláncokat is. Például a PostgreSQL-ben a SERIALIZABLE READ ONLY DEFERRABLE lehet.

Ne feledje, hogy egyes DBMS-k lehetővé teszik az elkülönítési szint konfigurálását az egész kapcsolat számára. A következő ügyletek ugyanazt az elszigetelési szintet kapják, még akkor is, ha nem adja meg. Ha ezt a funkciót használja, előfordulhat, hogy minden tranzakció esetében el kell választania az elkülönítési szintet, hogy elkerülje a kifejezetten egymásnak ellentmondó beállításokat. Jelen írásakor csak az MSSQL és az SQLite szenvedett el ettől a korláttól.

Megjegyzés: Az SQLite csak két elkülönítési szintet támogat, így csak READ UNCOMMITTED és SERIALIZABLE lehet. Más elszigetelési szintek használata kivételt eredményez.

Megjegyzés: A PostgreSQL nem teszi lehetővé az elkülönítési szint beállítását a tranzakció megkezdése előtt, így az elkülönítési szintet nem lehet a tranzakció elején beállítani. Ebben az esetben yii \ db \ Transaction :: setIsolationLevel () használhatja a tranzakció megkezdése után.

Beágyazott tranzakciók

Ha a DBMS támogatja a mentési pontot, az alábbiak szerint letétbe helyezheti az ügyleteket:

Az olvasási és írási kérelmek replikálása és megosztása

Számos DBMS támogatja az adatbázisok replikációját a jobb adatbázissal való elérhetőség és a gyorsabb szerver válaszidő miatt. Az adatbázis-replikációval az adatokat átmásolják a master kiszolgálókról a slave szerverekre. Minden beillesztésnek és frissítésnek meg kell jelennie a fő szerveren, bár az olvasást a slave szerverektől is elvégezheti.

A replikáció előnyeinek kihasználása és az olvasás és az írás elválasztásának elérése érdekében a yii \ db \ Connection összetevőt az alábbiak szerint kell konfigurálni:

A fenti konfiguráció egy mesterrel és több alárendelt rendszerrel rendelkezik. Az egyik rabszolgát összekapcsolják és olvasásra használják, míg a mester az írási kérésekhez használható. Ez az elolvasás és írás elválasztása automatikusan megtörténik a megadott konfigurációval. Például,

Információ: A yii \ db \ Command :: execute () függvényen végrehajtott lekérdezések írási kérelmekként vannak definiálva, és az összes többi lekérdezés olvasási kérelemnek tekinthető a yii \ db \ Command metódusok "lekérdezési" módszereinek egyikén keresztül. Az aktuális kapcsolat állapotát a slave kiszolgálón keresztül $ db-> slaveen keresztül kaphatja meg.

A Connection komponens támogatja a terheléskiegyenlítést és a slave szerverek hibakeresését. Az első olvasási kérelem végrehajtásakor a Connection elem véletlenszerűen kiválasztja a slave szervert, és megpróbál csatlakozni hozzá. Ha a szerver "halott", akkor megpróbál kapcsolódni a másikhoz. Ha a slave szerverek egyike sem áll rendelkezésre, akkor a mesterhez csatlakozik. Ha konfigurálja a kiszolgáló állapotának gyorsítótárát. a kiszolgálók elérhetetlensége tárolható, így nem használható egy meghatározott ideig.

Info: A fenti konfigurációban a slave szerverhez való csatlakozás időtúllépés 10 másodpercre van beállítva. Ez azt jelenti, hogy ha a szerver 10 másodpercen belül nem válaszol, akkor "halott" lesz. Ezt a paramétert a környezeti beállítások alapján módosíthatja.

Számos alap és több slave szervert is konfigurálhat. Például,

A fenti konfiguráció két fő és négy szolga szervert határoz meg. A Connection komponens támogatja a terheléselosztást és a failover funkciót az elsődleges szerverek, valamint az alárendeltek között. A különbség az, hogy ha egyik nagyobb szerver sem csatlakozik, kivételt fognak adni.

Megjegyzés: Ha a Masters tulajdonságot egy vagy több elsődleges kiszolgáló konfigurálásához használja, az adatbázishoz való kapcsolódás minden egyéb tulajdonsága (például a dsn.név, jelszó) figyelmen kívül hagyja a Connection elemet.

Alapértelmezés szerint a tranzakciók kapcsolatot létesítenek az elsődleges kiszolgálóval. A tranzakció során az összes adatbázis-művelet a kapcsolatot a fő kiszolgálóval fogja használni. Például,

Ha tranzakciót szeretne kezdeni egy slave szerveren, ezt kifejezetten meg kell adnia, az alábbiak szerint:

Néha előfordulhat, hogy az elsődleges kiszolgálóval való kapcsolaton keresztül olvasási kérelmet kell végrehajtania. Ezt a useMaster () módszerrel lehet elérni:

A db db-> enableSlaves értékét is kifejezetten false értékre állíthatjuk be, hogy az összes kérelmet a varázslóval való kapcsolatra irányítsa.

Az adatbázis sémával való együttműködés

A Yii DAO egy egész sémát kínál az adatbázis sémájának kezelésére, például új táblázatok létrehozására, oszlopok törléséről tábláról stb. Ezeket a módszereket az alábbiakban ismertetjük:

Ezek a módszerek az alábbiak szerint alkalmazhatók:

A táblázat sémáját a getTableSchema () módszerrel is megkaphatja. Például,

A módszer visszaadja a yii \ db \ TableSchema objektumot. amely információkat tartalmaz a táblázat oszlopairól, elsődleges kulcsokról, idegen kulcsokról stb. Az összes információt elsősorban a lekérdezés-készítő és az aktív rekord esetében használják. Annak érdekében, hogy az adatbázistól független kódot írjon.

Kapcsolódó cikkek