Címkék: #Adatbázis (Database) #Eloquent #Laravel #MySQL #Query Builder
Megjegyzés: ha a bevezetőben használt rövidítések nem lennének ismerősek, akkor érdemes újra átfutni az előző blogbejegyzésemet.
A mostani blogbejegyzéshez használt ábra szerencsére nagyon beszédes: ha jobb oldalról haladunk, akkor láthatjuk, hogy használhatunk mindenféle adatbáziskezelő rendszert (mi is alkalmaztunk már a MySQL-en kívül SQLite-ot, MS SQL-t, felhőbeli adatszolgáltatást is). A "DB Connection" rész felelős volt azért, hogy ezekhez a típusú rendszerekhez fel tudjuk építeni az alkalmazásunkból a kapcsolatot. Most pedig rátérünk arra, hogy hogyan lehet majd manipulálni az adattábláinkat (INSERT, UPDATE, DELETE stb.) illetve lekérdezni belőlük (SELECT). Ez a témakör olyan nagy, hogy biztosan több blogbejegyzésen át fogom ismertetni ezt a területet.
A Laravel keretrendszer kétféle lehetőséget nyújt a számunkra:
Miért is használjuk ezeket? Miért nem írunk simán SQL lekérdezéseket?
A válasz többrétű, mivel ezen fenti két eszköz használata olyan
előnyöket nyújt a számunkra, amelyeket vétek lenne nem kihasználni,
például:
Az Eloquent használatához szükség van arra, hogy az eddig "érintetlen" MVC elemhez nyúljunk, ez pedig nem más, mint a Model. Aki jól figyelt a blogbejegyzéseimre (főleg erre), akkor az már tudhatja, hogy a Model-ek két főbb dologért felelnek:
Az első pontra ismét felhívnám a figyelmet, mert nagyon sokan összekeverik az "üzleti logika megvalósítása" szempontjából a Model-t a Controller-rel. Fontos, hogy megjegyezzük, hogy a Model biztosítja az üzleti logikát.
De térjünk rá most a második pontra, hiszen az Eloquent szempontjából vizsgáljuk majd a Model-eket. Hozzunk is létre egy Model-t a projektünkbe:
php artisan make:model Post
Ennek hatására létrejött egy PHP fájl, a helye pedig, ha a Laravel 5.7-es verziójával dolgozunk, akkor az app mappába került be, ha pedig magasabb verziószámú a Laravel alkalmazásunk, akkor az app / Models mappába került be a Post.php fájl (a Laravel keretrendszerünk verzióját így tudjuk lekérdezni: php artisan --version). Igazából a mostani gyakorlatunk szerint nincs jelentősége annak, hogy melyik verziójú keretrendszerrel dolgozunk.
Ami viszont fontos: figyeljünk a névkonvenciókra! A Model neve nagy kezdőbetűvel indul és angolul egyes számban van, viszont alapértelmezetten ez a posts nevű (kis kezdőbetűs, bár az SQL erre nem érzékeny, de fontosabb, hogy angolul többes számban van) táblához fogja biztosítani a hozzáférést.
A létrejött Post Model-ünket megnézhetjük, azt láthatjuk, hogy ez pusztán egy egyszerű osztály, egy class, ami kiterjeszti a Model ősosztályt. Egyelőre ne is írjunk még bele semmi, pusztán használjuk!
Ha megvan még a PostsController-ünk (figyelem, névkonvenció itt is, angolul a Controller nevében többesszámban használjuk a Post-ot), akkor a show() metódusára tekintsünk. Bár akkor még nem tudtuk, amikor beleírtuk, de igazából egy Query Builder-t raktunk össze akkor: \DB::table('posts')->where('slug', $slug)->first(). Ezt fogjuk most lecserélni, úgyhogy kikommentezhetjük azt a sort és helyette írjuk be ezt:
$post = Post::where('slug', $slug)->first();
És a dd() -s sor elől vegyük ki a kommentezést, hogy kapásból megjelenjenek itt a $post objektum értékei majd.
A VSCode egyből alá is fogja húzni a Post szöveget, ez azért van, mert importálnunk kellene az előbb létrehozott Post osztályunkat. Szerencsés szituációban vagyunk, ha használunk Laravel-specifikus kiterjesztéseket a VSCode-ban, mert ekkor a Post szövegre kattintva jobb egérgombbal előjön a helyi menü, benne pedig az "Import class" menüpont (itt javasoltam a kiterjesztés csomagot). Ahogy korábban említettem, a Laravel keretrendszerünk verziószámától függően fogja az iménti Import-álás hatására vagy az App\Post vagy az App\Models\Post osztályt importálni a fájl tetejére. Ennek hatására megszűnik a Post felirat pirossal történő aláhúzása, most már hibamentes a kódunk újra.
(Remélhetőleg) elég sokat tesztelgettük már a rendszerünket, az adatbázisunkat, úgyhogy a további helyes működés érdekében szúrjunk be egy sort a posts nevű adattáblánkba:
INSERT INTO `posts` (`slug`, `title`, `body`) VALUES ('my-first-original-post', 'My first original post', 'This is my first original post with a title.');
(Ugye az oszlopok nevének sorrendje mindegy, a lényeg, hogy a VALUES után is ugyanabban a sorrendben következzenek az értékek.)
Teszteléshez hozzuk be utána a következő URL-t a böngészőnkben: http://127.0.0.1:8000/posts/my-first-original-post
Eredményül ezt kapjuk, ha az attributes melletti kis háromszögre is rákattintunk:
Látható, hogy egy elég komplex objektumot kaptunk vissza, ami önmagában a $post volt a kódunkban. Ennek az attributes mezőjébe került bele a tömb, ami tartalmazza az adatbázisból érkező egyetlen sor mezőinek értékeit, ahogy az az ábrán látható is.
Az Eloquent ORM (és a Query Builder-es) kapcsolatok nélküli lekérdezéshez kapcsolódó működési elv tehát a következőként fogható fel (példával is illusztrálva):
De mi a helyzet a manipulációs műveletekkel (létrehozás vagyis beszúrás, frissítés, törlés)? Ha így próbáljuk értelmezni az Eloquent ORM működését, akkor ...
Visszatérve a példakódunkra, hogy egy picit szebb eredményt kapjunk, ismét
kommentezzük ki a dd()-s sort és adjuk át a $post objektumot a post
nézetnek. A nézetben korábban a post body adattagját használtuk fel,
most egy kicsit még finomítsuk a post.blade.php kódját: a post title mezőjét írjuk ki egy h1-es fejlécbe a "My blog" helyett.
Ha azt szeretnénk, hogy egy kis hibakezelés is legyen a működésben, akkor a PostsController show metódusában a first() metódust cseréljük le erre: firstOrFail(), ami eléggé beszédes, hogy ha a posts adattáblában nem létező "slug"-ot próbálunk lekérni a böngésző URL-jében, akkor valamilyen barátságosabb hibát kapunk, mint ha simán a first() metódus esetében tennénk ugyanezt.
Megjegyzés: a Laravel 5.7-ben volt ilyen szép 404-es hibakódos nézet. Illetve a fordítás azért létezik, mert korábban már elkészítettük hozzá ennek a bejegyzésnek a végén.
A következő bejegyzésekben mélyítjük az Eloquent-es tudásunkat, használni fogunk egy Tinker nevű alkalmazást a Terminal-ban, aminek a segítségével valós időben fogjuk tudni tesztelni az alkalmazásunk Model-jeit, így az adatbázis menedzselését (beszúrás - INSERT, frissítés - UPDATE, törlés - DELETE), valamint a lekérdezését (SELECT). Utána pedig következhet majd az adattábla kapcsolatok kezelése, de nem rohanok még ennyire előre...
A legutóbbi és ezen blogbejegyzésnek a kódjai elérhetők ennél a git commit-nél.