Ebben a bejegyzésben beállítunk egy adatbázis kapcsolatot és az ehhez szükséges dolgokat tekintjük át, bár tudom, hogy már az előzőben is készítettünk adatbázist és elvégeztük a migrációt, de itt egy kicsit mögé fogunk nézni a dolgoknak.
Ehhez
először nyissuk meg az .env fájlt. Ez tartalmazza a legfontosabb, helyi
környezeti beállításokat a Laravel alkalmazásunkkal kapcsolatban. A
tárolás módja kulcs-érték párok összessége. Itt vannak az adatbázis
specifikus beállítások, módosítsuk ezeket eszerint:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db_1
DB_USERNAME=root
DB_PASSWORD=
A Laravel 6-os verziótól kezdve ezek a beállítás módosítások az .env
fájlban egyből érvényre jutnak, ezt látjuk is a terminal-ban, hogy
újraindul a development server kiszolgálása, azonban az 5.7-es verzióban
még le kell állítani a szerver kiszolgálását, majd újra kell indítani a
php artisan serve paranccsal, hogy a beállítások érvényre jussanak.
De
visszatérve a beállításokra, így gyakorlatilag egy API-n (Application
Programming Interface) keresztül tudjuk beállítani az adatbázis
kapcsolódás beállításait, mindenféle plusz programozás nélkül. Ezzel
megmondjuk a Laravel alkalmazásunknak, hogy egy MySQL
adatbázis-kezelőhöz szeretnénk csatlakozni, tehát használja a mysql
driver-t ehhez. A DB_HOST az az adatbázisszerver IP címe, ami jelen
esetben localhost, a port a mysql alapértelmezett port-ja. A database az
adatbázis neve, aminek léteznie kell az adatbázis szerveren, ezt
nemsokára, alább létre fogjuk hozni. A username és a password pedig az
alapértelmezett mysql motor eléréséhez szükséges felhasználónév és
jelszó páros. Utóbbiak kapcsán arra figyeljünk, hogy a root elérése csak
a helyi gépen működik, ha már egy másik gépről/gépre és annak
adatbázis-kezelőjére akarunk csatlakozni ezzel a felhasználóval, az már
nem fog ilyen alapértelmezetten működni.
Kicsit benézünk a
színfalak mögé, és megvizsgáljuk, hogy honnan jönnek ezek a (jelen
esetben DB_-vel kezdődő) attribútumok. Ehhez a config mappát kell
kinyitnunk és az abban lévő fájlokat érdemes megvizsgálni. Ez a fájl,
akárcsak a többi config mappában lévő fájl, szerencsére tele van
kommentekkel, amelyek elmagyarázzák az egyes lényegi sorok működését.
Minden konfigurációs fájl tömböket tartalmaz, amelyek gyakorlatilag
paraméterek beállításait tartalmazzák, ha végigkattintjuk a fájlokat,
akkor látható, hogy vannak beállításaink az alkalmazásra magára
(app.php), az adatbázisra (database.php - ezt fogjuk most tüzetesebben
megnézni), a levelezésre (mail.php) és még számos egyéb dologra, amit
most egyesével már nem sorolok fel. Jelen példánkban nézzük akkor a
database.php fájlt. A fájlban számos helyen láthatjuk az env()
segédmetódust. Ez megpróbál hozzáférni az .env fájlhoz, annak is a
metódus szerinti első paraméteréhez. Ha ez definiálva van az .env
fájlban, akkor rendben van és onnan fogja venni az általunk beállított
értéket. Ha nincs olyan attribútum az .env fájlban, akkor az env()
metódus második paraméterét veszi alapértelmezettnek, amit beállít az
első paraméter szerinti változóba.
'default' => env('DB_CONNECTION', 'mysql'),
Itt például látszódik, hogy az env metódus megpróbálja lekérni a
DB_CONNECTION változó értékét az .env fájlból és ha ott nem definiáltuk
volna, akkor beállítja hozzá alapértelmezetten a mysql-t.
Ha
legörgetünk a fájlban, akkor láthatjuk a 'connections' beágyazott tömb
elemei között, hogy többféle adatbázis kapcsolatot vagyunk képesek
definiálni az alkalmazásunkhoz. Ebben a blogbejegyzésben a mysql-re
koncentrálok, de a következőben ki fogom próbálni az sqlite (SQLite
adatbáziskezelő) és az sqlsrv (Microsoft SQL Server driver-ét) is.
A
MySQL adatbázis kezeléséhez már javasoltam az előző bejegyzésemben
többféle módszert is, azonban itt van még néhány alkalmazás, ami
alkalmas arra, hogy kezeljük. Megjegyzés: én továbbra is a Workbench-et
fogom használni, viszont a lehetőség nyitott arra, hogy bárki használhat
bármi mást ezek közül:
A
Workbench indítás után érzékelni fogja, hogy van már XAMPP-os MySQL
telepítve a gépünkre, úgyhogy felajánlja az ahhoz való csatlakozást,
amit egy dupla kattintással meg is tudunk tenni. Utána következhet a
példa adatbázisunk létrehozása és kezelése. Ezekhez SQL utasításokat
fogunk írni, mivel még csak gyakoroljuk az elérést, de a későbbiekben
ennél hatékonyabban fogjuk majd például definiálni az adattáblákat.
Nyissunk egy új Query ablakot és adjuk ki ezt az utasítást:
CREATE DATABASE laravel_db_1;
Ezután kattintsunk a villám jelű gombra (vagy a végrehajtás gombra, ha
más menedzselőt használunk), ami létrehozza az adatbázist. Nem biztos,
hogy a Workbench a Navigator panelben egyből mutatni fogja az újonnan
létrejött adatbázis nevét, ezért érdemes a panel jobb felső részében a
frissítésre kattintani, valamint figyeljünk arra is, hogy a panel alsó
részén a Schemas legyen kiválasztva. (Az adatbázis nevét, szabadon
kiválaszthatja bárki, túlzott jelentősége nincsen, csak majd ne
felejtsük el ugyanazt beállítani az .env fájl DB_DATABASE
paraméterének.)
USE laravel_db_1;
CREATE TABLE `posts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`slug` varchar(45) DEFAULT 'posts URI',
`body` text,
PRIMARY KEY (`id`)
);
Majd adjunk is hozzá az új táblánkhoz egy sort:
INSERT INTO `posts` (`slug`, `body`) VALUES ('my-first-post', 'This is my first post.');
Adjuk a show metódus paraméterének a $post változó helyett a $slug-ot,
hiszen ez beszédesebb, mert így hívjuk az adatbázisban is a post-ok
URI-ját. A metódus elejére pedig írjuk ezeket:
$post = \DB::table('posts')->where('slug', $slug)->first();
dd($post);
Az első sorban a posts adattáblához férünk hozzá, méghozzá azok a sorok
kellenek nekünk, ahol a slug mező megegyezik a paraméterül kapott $slug
változóval és ezek közül is az első találatra van szükségünk. (A
globálisan létező DB osztály-t fogjuk ehhez használni, ha kitörölnénk az
előtte lévő backslash-t, akkor hibát kapnánk, mert a Laravel az App /
Http / Controllers mappában keresné ezt a DB osztályt. Ha mégis azt
szeretnénk, hogy a kezdeti \ nélkül is működjön a kódunk, akkor
importáljuk az osztályunk előtt:
use Illuminate\Support\Facades\DB;
Majd az utána lévő sorban rögtön egy nagyon hasznos segédfüggvényt ismerhetünk meg, ami a dd() névre hallgat. Itt megáll a program futása és kiírja azt, amit paraméterül kapott, itt most a $post objektum tartalmát.
Teszteljük, nyissuk meg az URL-t: http://127.0.0.1:8000/posts/123
Null-t
kapunk vissza, hiszen az adattáblánkban nem létezik olyan adatsor,
aminél 123 szerepel a slug oszlopban. Ha ezt írjuk be: http://127.0.0.1:8000/posts/my-first-post
Akkor
már nyerők vagyunk és visszakapjuk az adattáblánk megfelelő sorának
mezőit és adatait. Most nincs más dolgunk, mint kikommentezni a
dd(...)-s sort, majd átadni a $post-ot a view-nknak a már megismert
view() és compact() segédmetódusok segítségével.
return view('post', compact('post'));
Frissítés után azonban még nem lesz jó a weboldalunk, ugyanis a
post.blade.php fájlban a $post változót akarjuk kiíratni, ami jelen
esetben már egy objektum, nem pedig egy szöveges érték. Ezért módosítsuk
kicsit a kiíratását és a body mezőjét írjuk ki a $post objektumnak:
{{ $post->body }}
Ha frissítjük a böngészőt, most már a megfelelő értéket fogjuk visszakapni, az adott blogbejegyzés törzsét.
Kiegészítés: sokat fogjuk még használni a DB query elemeket, mert nagyon hasznosak. Továbbá bármilyen tábla vagy akár adatbázis nézethez tudunk kapcsolódni, azokból adatokat lekérni. A kérés eredménye mindig egy gyűjtemény lesz, amit már az ismert módon tudunk kezelni. Itt van egy lekérdezésre példa:
$simulations = DB::select('SELECT * FROM simulated_production_data ORDER BY created DESC');
A blogbejegyzéshez tartozó Github commit itt érhető el: DB Access 1. rész