Veritabanı ve ORM Sürüm: 11.x
Topluluk Dokümantasyonu

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();
Bu sayfa açık kaynaklı olarak topluluk tarafından güncellenmektedir.
Dokümantasyon Başına Dön ↑