Yii relációs lekérdezések

Relációs aktív rekord

Már megvizsgáltuk az Active Record (AR) használatával az adatbázistábla adatainak kiválasztását. Ebben a részben bemutatjuk, hogyan használhatod az AR-t, ha több kapcsolódó táblát csatlakoztatsz, és egy sor kapcsolódó adatot kapsz. A relációs AR használata előtt ajánlott külföldi kulcskorlátokat megadni az adatbázis táblázatokhoz. Ez biztosítja a tárolt adatok konzisztenciáját és integritását. Az ebben a részben található példák egyértelműségére a következő entitások-kapcsolat diagramban (ER) bemutatott adatbázis sémát fogjuk használni.







Információ: A külföldi kulcskorlátozások támogatása különbözik a különböző DBMS-kben. Az SQLite 3.6.19 és a korábbi verziók nem támogatják a korlátozásokat, de táblázatok létrehozásakor továbbra is deklarálhatják azokat. A MyISAM MySQL motor nem támogatja a külföldi kulcsokat.

1. Az AR osztályok közötti kapcsolatok kialakítása

Mielőtt AR-t használna relációs lekérdezések végrehajtásához, létre kell hoznunk az AR osztályok közötti kapcsolatokat. A két AR osztály közötti kapcsolat közvetlenül a megfelelő adatbázis táblák közötti kapcsolatoktól függ. Szemszögéből az adatbázis, a kapcsolat a táblázatok A és B lehet három típusba sorolhatók: az egyik a többhöz (például tbl_user és tbl_post), egy-egy (például, tbl_user és tbl_profile) és sok-sok (például tbl_category és tbl_post). Az AR-ben négyféle link létezik:
  • BELONGS_TO. ha az A és B közötti kapcsolat egy-sok-sok, akkor B az A-hoz tartozik (például a Post a felhasználóhoz tartozik);
  • HAS_MANY. ha az A és B táblák közötti kapcsolat egy-sok-sok, akkor A-nak sok B van (például a Felhasználónak sok Postja van);
  • HAS_ONE. ez a HAS_MANY különleges eset. ahol A legfeljebb egy B lehet (például a felhasználónak csak egy profilja van);
  • MANY_MANY. ez a kapcsolat megfelel az adatbázisban sok-sok-sok kommunikációnak. Mivel számos DBMS nem támogatja közvetlenül az ilyen típusú kapcsolatot, egy társulási táblázat szükséges ahhoz, hogy sok-sok kommunikációt egy-sok kapcsolaton keresztül alakítson át. Adatbázisunkban ez a cél az asztal tbl_post_category. Az AR terminológiában a MANY_MANY kapcsolat a BELONGS_TO és a HAS_MANY kombinációjaként írható le. A Post például számos kategóriába tartozik. és a kategória nagyon sok feladatot tartalmaz.
Van egy ötödik, egy speciális típusú kommunikáció, amelynek célja statisztikai lekérdezéseket kapcsolódó bejegyzések (aggregált lekérdezések) - ez az úgynevezett STAT. További információ: Statisztikai lekérdezés. A kapcsolódás a CActiveRecord osztály relációs () metódusán belül történik. Ez a módszer egy tömböt ad vissza egy linkkonfigurációval. A tömb minden eleme az alábbi formátumú linket jelenti:





ahol varname - kapcsolat nevét, RelationType jelzi egy négy típusú kötvények, ClassName - neve AR-osztályú társított az osztály, és ForeignKey jelentése egy vagy több idegen kulcsok, hogy a használt kommunikációs. Ezenkívül számos további paramétert adhat meg, amelyeket később tárgyalunk. A következő kód mutatja be, hogyan kell létrehozni a kapcsolatot a Felhasználó és a Post osztály között.

2. Relációs lekérdezés végrehajtása

A relációs lekérdezés legegyszerűbb módja az AR osztály relációs tulajdonságának használata. Ha a fellebbezés történik az ingatlan az első alkalommal, akkor relációs lekérdezés, amely összeköti a két kapcsolódó táblákat, és hagyja csak a megfelelő adatokat az elsődleges kulcs az aktuális példányt AR. A lekérdezés eredményét a tulajdonságban a társult osztály példánya (vagy tömbje) tárolja. Ezt a megközelítést néha lusta betöltésnek is nevezik, amelyben a közvetlen lekérdezést csak a kapcsolódó objektumokhoz való első hozzáférés időpontjában hajtják végre. Az alábbiakban egy példa erre a megközelítésre:

Ezen felül, beágyazott mohó letöltéseket is végrehajthat. Ehhez a linknevek egyszerű listájának helyett a hierarchikus módon rendelt linkek nevét () kell átadni a () függvénynek, mint a következő példában:

3. Relációs lekérdezés a kapcsolódó modellek beszerzése nélkül

4. Relációs lekérdezési paraméterek

5. Az oszlopnév ütközések megszüntetése

Tipp: A kommunikációs táblázat alias alapértelmezés szerint megegyezik a link nevével. Ne feledje, hogy ha a másikban egy linket használ, az utolsó neve kerül felhasználásra. A szülő kapcsolat neve nem használható előtagként. Például a "szerző.csoport" hivatkozás alias "csoport", nem pedig "author.group".

Az alias kapcsolat tulajdonság beállításával elkerülheti a táblázati álnevek ütközését.

6. Relációs lekérdezés dinamikus paraméterei

7. A relációs lekérdezés teljesítménye

A mohó indításhoz ezt a paramétert dinamikusan állíthatjuk be:

8. Statisztikai lekérdezés

9. Relációs lekérdezések a megnevezett állapotcsoportokkal

A relációs lekérdezésben a feltételes állapotcsoportokat kétféleképpen lehet használni. Alkalmazhatók az alapmodellre és a kapcsolódó modellekre. A következő kód szemlélteti a fő modellre történő alkalmazásuk esetét:

Az 1.1.7-es verzióban lehetővé vált a paraméterek átadása a kommunikációs feltételek megnevezett csoportjainak. Például, ha a Post rendelkezik a megadott feltételcsoporttal. részesülő minimum minősítés rekord, használd a felhasználó a következő: Megjegyzés: verzió előtt 1.1.7 nevű körök alkalmazott kapcsolódó modelleket kell leírni CActiveRecord :: hatókörét. Ezért nem lehet paraméterezni.

10. Relációs lekérdezések át

Használat közben a kapcsolat definíciónak így kell kinéznie:

HAS_MANY keresztül

HAS_MANY keresztül ER

Yii relációs lekérdezések

HAS_ONE keresztül

HAS_ONE keresztül ER

keresztül velem

keresztül használható egy hídhoz csatlakoztatott modellhez. Jelen esetben ez a felhasználó más felhasználókat is tanít:

az önálló ER-n keresztül

Az ügy kapcsán a következő összefüggéseket határozzák meg:




Kapcsolódó cikkek