Eloquent to ORM Laravela oparty na modelu ActiveRecord. To brzmi skomplikowanie, ale w rzeczywistości Eloquent pozwala po prostu w bardziej przejrzysty sposób współpracować z tabelami w bazie danych. Stwórzmy model Eloquenta Post
, najłatwiej będzie użyć komendy Artisana, wpiszmy w terminalu:
php artisan make:model Post
Ta komenda stworzyła plik app/Post.php
z następującą treścią:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
//
}
Na pierwszy rzut oka klasa Post
jest pusta. Ale istotne jest to, że dziedziczy po klasie Illuminate\Database\Eloquent\Model
, która zawiera mnóstwo przydatnych metod.
Pobieranie danych
Użyjmy teraz tego modelu do pobrania danych z tabeli posts
.
use App\Post;
$posts = Post::all();
Używamy instrukcji Post::all()
do pobrania wszystkich wpisów z tabeli.
Każdy model Eloquenta pozwala nam używać metod query buildera, które poznaliśmy w poprzednim wpisie:
use App\Post;
$posts = Post::where('is_published', true)
->orderBy('created_at', 'desc')
->limit(10)
->get();
Możemy też pobrać konkretny wpis używając instrukcji where()->first()
lub skrótowej metody find()
.
use App\Post;
$post = Post::where('id', 1)->first();
// lub
$post = Post::find(1);
Metoda find()
wyszukuje rekord po kolumnie id
.
Wstawianie danych
use App\Post;
$post = new Post;
$post->title = 'My first post';
$post->save();
Tworzymy nowy obiekt klasy Post
, zapisujemy parametr title
po czym zapisujemy go do bazy danych za pomocą metody save()
. Wartości pól created_at
i updated_at
uzupełnią się automatycznie.
Innym sposobem jest użycie metody create()
i przekazanie jej tablicy kolumn i wartości.
use App\Post;
Post::create([
'title' => 'My first post',
'body' => 'Lorem ipsum dolor sit amet',
]);
Jest tu jednak pewien haczyk. Laravel domyślnie broni nas przed tak zwanym mass-assignment. Wyobraźmy sobie, że zapisujemy do bazy danych pola z formularza rejestracji przesłanego przez użytkownika. Jeśli użytkownik doda do formularza pole, którego się nie spodziewaliśmy, może na przykład zmienić swój status w bazie danych. Zobaczmy to na przykładzie:
User::create($request->all());
Metoda $request->all()
zwróci nam wszystkie pola z formularza. Domyślnie spodziewamy się tam na przykład adresu e-mail i hasła, ale użytkownik może tam dodać dowolne pole. Na przykład pole is_admin
o wartości true
.
W ten sposób nieświadomie zapisalibyśmy nowego użytkownika z flagą is_admin
ustawiona na wartość true
.
W każdym modelu możemy ustawić parametr $fillable
równy tablicy pól, które mają być zapisywane w ten sposób:
// app/User.php
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
}
Każde pole, które nie znajdzie się w tej tablicy zostanie usunięte przy próbie zapisu metodą create()
.
Żeby móc zapisać tytuł i treść wpisu za pomocą metody create()
ustawmy wartość pola $fillable
w naszym modelu Post
:
protected $fillable = ['title', 'body'];
Edytowanie danych
Metody save()
możemy też użyć gdy chcemy edytować istniejący rekord:
use App\Post;
$post = Post::find(1);
$post->title = 'My first edited post';
$post->save();
Innym sposobem jest użycie metody query buildera update()
, do której przekazujemy tablicę kolumn i wartości:
use App\Post;
Post::where('id', 1)->update([
'title' => 'My first edited post',
]);;
Usuwanie danych
Rekordy z bazy danych usuwamy za pomocą metody delete()
lub skrótowej metody destroy()
.
Post::find(1)->delete();
// lub
Post::destroy(1);
W tej części tutoriala dowiedzieliśmy się jak tworzyć i używać modeli Eloquenta. W następnej części nauczymy się definiować i używać relacji pomiędzy modelami Eloquenta.