Laravel Tablolar Arası İlişkiler -Relations
youBirbiriyle ilişkisi olan tablolardan veri çekmek için kullanacağımız yöntemleri inceleyeceğiz.
One to One (birebir)
One to Many (birden çoğa)
Many to Many (çoktan çoğa)
Örnek tablolarımızı oluşturalım
Birey tablosu:
1 |
php artisan make:migration create_birey_table --create=birey |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateBireyTable extends Migration { public function up() { Schema::create('birey', function (Blueprint $table) { $table->increments('BireyId'); $table->string('Adi',100); $table->string('SoyAdi',100); $table->timestamps(); }); } public function down() { Schema::dropIfExists('birey'); } } |
Birey tablomuzu oluşturduk.
Nufusbilgileri tablosu
1 |
php artisan make:migration create_nufusbilgilerş_table --create=NufusBilgileri |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateNufusbilgileriTable extends Migration { public function up() { Schema::create('NufusBilgileri', function (Blueprint $table) { $table->increments('id'); $table->integer('BireyId'); $table->string('TckNo'); $table->string('DogumYeri'); $table->date('DogumTarihi'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('NufusBilgileri'); } } |
daha sonra tabloları aktif etmek için aşağıdaki komutu yazıyoruz
1 |
php artisan migrate |
Şimdi sıra model oluşturmaya geldi.
One to One – birebir ilişki kurma
Birey.php için aşağıdakileri yapalım
1 |
php artisan make:model Birey |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Birey extends Model { protected $primaryKey='BireyId'; protected $table='Birey'; protected $fillable=array('Adi','Soyadi'); public function NufusBilgileri(){ return $this->hasOne('App\NufusBilgileri','BireyId'); } } |
1 |
return $this->hasOne('App\NufusBilgileri','BireyId'); |
bu komut ile birey modelini NufusBilgileri modeli ile ilişkilendiriyoruz . böylece “birey” tablosundaki bir kişinin “nufusBilgileri” tablosundaki bilgilere direk erişebileceğiz.
NufusBilgileri modeli için aşağıdakileri yapalım.
1 |
php artisan make:model NufusBilgileri |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class NufusBilgileri extends Model { // protected $primaryKey='NufusId'; protected $table='NufusBilgileri'; public function Birey(){ return $this->belongsTo('App\Birey','BireyId'); } } |
Örnek :
Adı “osman” olan bireyin doğum yerini alalım.
1 2 3 4 5 6 7 |
use App\Birey; use App\NufusBilgileri; //echo Birey::all(); $kayit=Birey::where('Adi','osman')->first(); $nufus=$kayit->NufusBilgileri; echo $kayit->Adi.' '.$kayit->Soyadi.' '.$nufus->DogumYeri; |
ekran çıktısı
1 |
Osman Duman Ankara |
Örnek :
Doğum yeri Ankara olan bireyin adı ve soyadı bilgisini alalım.
1 2 3 4 5 6 |
use App\Birey; use App\NufusBilgileri; $sehir=NufusBilgileri::where('Dogumyeri','=','Ankara')->first(); $isim=$sehir->Birey; echo $isim->Adi.' '.$isim->Soyadi.' '.$sehir->DogumYeri; |
Örnek tüm bireylerin adlarını ve memleketlerini alalım:
1 2 3 4 5 6 7 8 |
use App\Birey; use App\NufusBilgileri; $bireyler=Birey::all(); foreach ($bireyler as $birey) { echo $birey->Adi.' '.$birey->Soyadi.' '.$birey->NufusBilgileri->DogumYeri."<br>"; } |
ekran çıktısı
1 2 3 |
Ali Onur Bursa Osman Duman Ankara Fatma Aksoy Samsun |
foreign key kullanımı
Foreign key ile bir birine ilişkili tablolarda ;
bir tablodan veri silindiğinde ilişkili tablodan da veri silinmesini sağlarız.
NufusBilgileri tablosunda aşağıdaki gibi foreign key satırını ekleyelim:
1 2 3 4 5 |
Schema::create('NufusBilgileri', function (Blueprint $table) { $table->increments('id'); $table->integer('BireyId'); $table->foreign('BireyId')->references('BireyId')->on('Birey')->onDelete('cascade'); $table->string('TckNo'); |
önceden yaptığımızı tabloları silmek için aşağıdaki kodu çalıştırın
1 |
php artisan migrate:reset |
tabloları yeniden oluşturmak için
1 |
php artisan migrate |
şimdi ilişkisel silmeyi deniyoruz
1 |
Birey::destroy(1); |
dediğimizde 2 tablodan da silmesi gerekiyor (not bende olmadı… mysql motoru olarak myısam kullandığım için olabilir)
One To Many (birden çoğa ilişki)
bu tip bir yapıyı şöyle örnekleyebiliriz. Bir kişi markete girip birden fazla alışveriş yapabilir. şimdi kullanımına geçelim.
göevlendirme tablomuzu oluşturalım
1 |
php artisan make:migration create_gorevlendirme_table --create=Gorevlendirmeler |
birey php yi değiştiriyoruz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Birey extends Model { protected $primaryKey='BireyId'; protected $table='Birey'; protected $fillable=array('Adi','Soyadi'); //bireyin bir nufus bilgisi vardır public function NufusBilgileri(){ return $this->hasOne('App\NufusBilgileri','BireyId'); } //birey birden fazla görevde bulunabilir. public function Gorevlendirmeler(){ return $this->hasMany('App\Gorevlendirmeler','BıreyId'); } } |
Görevlendirmeler modelini oluşturuyoruz
1 |
php artisan make:model Gorevlendirmeler |
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Gorevlendirmeler extends Model { protected $primaryKey='GorevlendirmeId'; protected $table='gorevlendirmeler'; protected $fillable= array('GorevlendirmeYeri','GorevlendirmeNedeni'); public function Birey(){ return $this->belongsTo('App\Birey','BireyId'); } } |
Örnek: Adı ali olan vatandaşın aldığı görev yerlerini yazdıralım
1 2 3 4 5 6 7 8 9 10 11 |
use App\Birey; use App\NufusBilgileri; use App\Gorevlendirmeler; $kayit=Birey::where('Adi','Ali')->first(); echo $kayit->Adi.' '.$kayit->Soyadi.' görevleri'.'<br>'; foreach($kayit->Gorevlendirmeler as $gorev) { echo $gorev->GorevlendirilmeYeri.'<br>'; } |
Ekran Çıktısı
1 2 3 4 |
Ali Onur görevleri Adana Bursa Yalova |
Şimdide görev yeri Bursa olanları gösterelim
1 2 3 4 5 6 7 8 9 |
use App\Birey; use App\NufusBilgileri; use App\Gorevlendirmeler; $sonuclar=Gorevlendirmeler::where('GorevlendirilmeYeri','=','Bursa')->get(); foreach ($sonuclar as $sonuc) { echo $sonuc->Birey->Adi.' '.$sonuc->Birey->Soyadi.'<br> '; } |
ekran çıktısı
1 2 |
Ali Onur Osman Duman |
Many To Many (Çoğa çok ilişki)
Örneğin bir birey birden çok ders girebileceği gibi , bir ders birden çok birey girebilir.
Dersler tablosunu oluşturuyoruz.