Adatbázis hozzáférés 1. rész - Kapcsolat beállítása

Attila | 2022. 02. 19. 21:42 | Olvasási idő: 3 perc

Címkék: #Adatbázis (Database) #Laravel #Laravel 5.7 #Laravel 6 #Laravel 7 #Laravel 8 #MySQL

Az eddigi példáinkban egy változót vagy tömböt használtunk adattárolónak. Ez nem túlságosan életszerű megoldás, szóval a most következő bejegyzésekben meg fogjuk tanulni, hogyan kell valódi adatbázisokat kezelni. Átnézzük az adatbázis kapcsolatokat, a releváns beállítási fájlokat és az adatbázis lekérdezések felépítését is.
db_connection

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); // dump & die

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