Başlarken
Görünüm ve Arayüz
Veritabanı ve ORM
Eloquent ORM ve Veritabanı
Özet: Laravel Eloquent ORM, Active Record modeli, veritabanı sorguları, toplu atama ve yumuşak silme (Soft Deletes).
Eloquent ORM ve Veritabanı
Laravel, veritabanınızla etkileşim kurmayı son derece keyifli hale getiren Eloquent adında gelişmiş bir Nesne-İlişkisel Eşleme (ORM - Object-Relational Mapper) aracı içerir. Eloquent, Active Record mimarisini benimser. Bu mimaride her veritabanı tablosu, o tabloyla etkileşime giren karşılık gelen bir Model sınıfına sahiptir.
Eloquent modelleri veritabanı tablonuzdan kayıt sorgulamanıza, yeni kayıtlar eklemenize, güncellemenize ve ilişkili modelleri kolayca yönetmenize olanak tanır.
Model Oluşturma
Yeni bir Eloquent modeli oluşturmak için make:model Artisan komutunu kullanabilirsiniz:
php artisan make:model Flight
Model oluştururken veritabanı migration (göç) dosyasını da üretmek için -m veya --migration bayrağını ekleyebilirsiniz:
php artisan make:model Flight -m
Model ile birlikte factory, seeder ve controller gibi tüm ilişkili sınıfları tek komutla oluşturmak için:
php artisan make:model Flight -all
Oluşturulan model varsayılan olarak app/Models dizininde saklanır:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
use HasFactory;
}
Eloquent Model Kuralları
Tablo İsimleri
Laravel kuralları gereği, model adının çoğul ve "snake_case" hali veritabanı tablo adı olarak kullanılır (örn: Flight modeli flights tablosuna bakar). Modelinizin farklı bir tabloyu kullanmasını isterseniz $table özelliğini tanımlayabilirsiniz:
class Flight extends Model
{
/**
* Model ile ilişkili tablo adı.
*
* @var string
*/
protected $table = 'my_flights';
}
Birincil Anahtarlar (Primary Keys)
Eloquent varsayılan olarak her tabloda id adında birincil anahtar sütunu olduğunu varsayar:
class Flight extends Model
{
/**
* Tablonun birincil anahtarı.
*
* @var string
*/
protected $primaryKey = 'flight_id';
/**
* Birincil anahtarın otomatik artan olup olmadığını belirtir.
*
* @var bool
*/
public $incrementing = true;
/**
* Birincil anahtarın veri türü.
*
* @var string
*/
protected $keyType = 'int';
}
Zaman Damgaları (Timestamps)
Eloquent, tablolarınızda created_at ve updated_at sütunlarının bulunduğunu varsayar ve kayıt oluşturulduğunda/güncellendiğinde bu sütunları otomatik doldurur. Devre dışı bırakmak için:
class Flight extends Model
{
/**
* Zaman damgalarının otomatik yönetilip yönetilmeyeceği.
*
* @var bool
*/
public $timestamps = false;
}
Modelleri Sorgulama ve Alma
Her Eloquent modeli, ilişkili veritabanı tablosunu akıcı bir şekilde sorgulamanıza olanak tanıyan güçlü bir sorgu oluşturucu (Query Builder) görevi görür.
Tüm Kayıtları Alma
use App\Models\Flight;
$flights = Flight::all();
foreach ($flights as $flight) {
echo $flight->name;
}
Koşullu Sorgular ve Filtreleme
$flights = Flight::where('active', 1)
->orderBy('name')
->take(10)
->get();
Tek Bir Kaydı veya İlk Kaydı Alma
// Birincil anahtara göre alma:
$flight = Flight::find(1);
// Sorgu koşuluyla eşleşen ilk kaydı alma:
$flight = Flight::where('active', 1)->first();
// Alternatif kısa sözdizimi:
$flight = Flight::firstWhere('active', 1);
Bulunamadığında Hata Fırlatma (findOrFail)
Eğer model bulunamazsa otomatik olarak bir ModelNotFoundException (ve dolayısıyla 404 HTTP yanıtı) fırlatılmasını istiyorsanız findOrFail veya firstOrFail yöntemlerini kullanabilirsiniz:
$flight = Flight::findOrFail(1);
$flight = Flight::where('legs', '>', 3)->firstOrFail();
Büyük Veri Kümelerini Parçalama (chunk)
Binlerce Eloquent kaydı üzerinde işlem yaparken bellek (RAM) tüketimini minimumda tutmak için chunk yöntemini kullanabilirsiniz:
Flight::chunk(200, function ($flights) {
foreach ($flights as $flight) {
// Her 200 kayıtta bir bu blok çalışır...
}
});
Kayıt Ekleme ve Güncelleme
Temel Kayıt Ekleme
Yeni bir veritabanı kaydı eklemek için modelden yeni bir örnek oluşturup özelliklerini atadıktan sonra save metodunu çağırın:
use App\Models\Flight;
$flight = new Flight;
$flight->name = 'İstanbul - Londra';
$flight->flight_number = 'TK1984';
$flight->save();
Temel Kayıt Güncelleme
Mevcut bir modeli veritabanından çekip özelliklerini değiştirdikten sonra save metodunu çağırarak güncelleyebilirsiniz:
$flight = Flight::find(1);
$flight->name = 'İstanbul - Paris';
$flight->save();
Toplu Atama (Mass Assignment)
Tek bir satırda dizi verisi aktararak model oluşturmak için create yöntemini kullanabilirsiniz:
$flight = Flight::create([
'name' => 'İstanbul - Tokyo',
'flight_number' => 'TK1988',
]);
$fillable ve $guarded
Toplu atama güvenlik açıklarını (kullanıcının izinsiz kolonları güncellemesini) engellemek için, modelinizde hangi alanların toplu atanabileceğini ($fillable) ya da hangilerinin korunacağını ($guarded) tanımlamanız zorunludur:
class Flight extends Model
{
/**
* Toplu atanabilir öznitelikler.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'flight_number',
];
}
Tüm alanları toplu atamaya açmak için $guarded boş bırakılabilir:
protected $guarded = [];
firstOrCreate ve updateOrCreate
Belirtilen kriterlerle kayıt varsa getiren, yoksa oluşturan veya güncelleyen pratik yöntemler:
// Kayıt varsa getirir, yoksa yeni kayıt oluşturup veritabanına yazar:
$flight = Flight::firstOrCreate(
['flight_number' => 'TK1984'],
['name' => 'İstanbul - Londra']
);
// Kayıt varsa günceller, yoksa yeni oluşturur:
$flight = Flight::updateOrCreate(
['flight_number' => 'TK1984'],
['name' => 'İstanbul - Londra (Revize)']
);
Kayıt Silme
Bir modeli silmek için model örneği üzerinde delete yöntemini çağırabilirsiniz:
$flight = Flight::find(1);
$flight->delete();
Birincil Anahtarla Silme (destroy)
Flight::destroy(1);
// Birden fazla kaydı tek seferde silme:
Flight::destroy(1, 2, 3);
Flight::destroy([1, 2, 3]);
Yumuşak Silme (Soft Deletes)
Kayıtları veritabanından tamamen silmek (hard delete) yerine, silinme zamanını (deleted_at) işaretleyerek saklamak için Laravel'in SoftDeletes özelliğini kullanabilirsiniz.
Modeli Hazırlama
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Flight extends Model
{
use SoftDeletes;
}
Not: Migration dosyanızda
$table->softDeletes();sütununu eklemiş olmanız gerekir.
Yumuşak Silinmiş Kayıtları Sorgulama
Yumuşak silinmiş kayıtlar normal sorgularda otomatik olarak filtrelenir.
// Silinmiş kayıtları da dahil etmek için:
$flights = Flight::withTrashed()->get();
// Yalnızca silinmiş kayıtları listelemek için:
$flights = Flight::onlyTrashed()->get();
// Silinmiş bir kaydı geri kurtarmak için:
$flight->restore();
// Kaydı veritabanından kalıcı olarak silmek için:
$flight->forceDelete();