Merhaba,
Bu yazıda Laravel'de veritabanı ilişkileri (eloquent relationships) işlemlerinin nasıl yapıldığından bahsedeceğim. Bu işlemleri göstermek adına yapmış olduğum örnek projeyi Github üzerinden paylaştım. İndirip inceleyebilirsiniz.
İlk olarak istediğimiz bir dizinde (ör: masaüstü) komut satırını açıp yeni bir Laravel projesi oluşturmak için gerekli kodları yazıyoruz:
composer create-project --prefer-dist laravel/laravel eloquent-relationships
Sonrasında Xampp yardımıyla yerelde bir veritabanı oluşturuyoruz. Proje kök dizinindeki .env dosyasını açarak veritabanı bilgilerini aşağıdaki gibi düzenliyoruz:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=eloquent-relationships DB_USERNAME=root DB_PASSWORD=
defaultStringLength hatasıyla karşılaşmamak için app/Providers/AppServiceProvider.php dosyasını açarak boot() fonksiyonunu düzenliyoruz:
public function boot()
{
Schema::defaultStringLength(191);
}
Şimdi veritabanı tablolarımızı oluşturmak adına gerekli migration'ları oluşturuyoruz:
php artisan make:migration create_addresses_table php artisan make:migration create_articles_table php artisan make:migration create_roles_table php artisan make:migration create_role_user_table php artisan make:migration create_countries_table
Tablolarımız şu şekilde olacak;
adresses: id (int), user_id (int), address (varchar)
articles: id (int), user_id (int), title (varchar), body (varchar)
roles: id (int), name (varchar)
role_user: id (int), user_id (int), role_id (int)
countries: id (int), name (varchar)
Not: Proje oluşturulduğunda otomatik olarak gelen users migration içerisinde de aşağıdaki tablo yapısına göre düzenleme yapıyoruz.
users: id (int), name (varchar), country_id (int)
Şimdi veritabanı ilişkilerine geçebiliriz:
One to one
Senaryo: Bir kullanıcının bir adresi olabilir.
İstenen: Verilen kullanıcı id'sine göre kullanıcının adresine ulaşmak
Yapılacak işlemler:
- users tablomuzu açıp yeni bir kayıt ekliyoruz (id: 1, name: Yusuf, county_id: 0)
- addresses tablomuzu açıp yeni bir kayıt ekliyoruz (id: 1, user_id: 1, address: Nilüfer/Bursa)
- Address modelimizi oluşturuyoruz;
php artisan make:model Address
- User modelimize gerekli fonksiyonu ekliyoruz;
public function address()
{
return $this->hasOne('App\Address')->select('address');
}
- api.php dosyamızı açıp gerekli route tanımını yapıyoruz;
Route::get('user_address/{user_id}', 'UserController@user_address');
- Controller dosyamızı oluşturuyoruz:
php artisan make:controller UserController
- UserController dosyamızı açıp gerekli fonksiyonu ekliyoruz;
public function user_address($user_id)
{
$user = User::find($user_id);
return $user->address;
}
Sonuç:
Gerekli komutu çalıştırıyoruz;
php artisan serve
Postman üzerinden isteği yapıyoruz;
- Link: http://localhost:8000/api/user_address/1
- Metod: GET
- Cevap:
{
"address": "Nilüfer/Bursa"
}
One to many
Senaryo: Bir kullanıcının yazdığı birden çok makalesi olabilir.
İstenen: Verilen kullanıcı id'sine göre kullanıcının makalelerine ulaşmak
Yapılacak işlemler:
- users tablomuzu açıp yeni bir kayıt ekliyoruz (id: 2, name: Jack, county_id: 0)
- articles tablomuzu açıp yeni kayıtlar ekliyoruz;
- (id: 1, user_id: 1, title: Makale-1, body: Makale-1 içerik)
- (id: 2, user_id: 1, title: Makale-2, body: Makale-2 içerik)
- (id: 3, user_id: 2, title: Makale-3, body: Makale-3 içerik)
- Article modelimizi oluşturuyoruz;
php artisan make:model Article
- User modelimize gerekli fonksiyonu ekliyoruz;
public function articles()
{
return $this->hasMany('App\Article')->select('title', 'body');
}
- api.php dosyamızı açıp gerekli route tanımını yapıyoruz;
Route::get('user_articles/{user_id}', 'UserController@user_articles');
- UserController dosyamızı açıp gerekli fonksiyonu ekliyoruz;
public function user_articles($user_id)
{
$user = User::find($user_id);
return $user->articles;
}
Sonuç:
Gerekli komutu çalıştırıyoruz;
php artisan serve
Postman üzerinden isteği yapıyoruz;
- Link: http://localhost:8000/api/user_articles/1
- Metod: GET
- Cevap:
[
{
"title": "Makale-1",
"body": "Makale-1'in içeriği"
},
{
"title": "Makale-2",
"body": "Makale-2'nin içeriği"
}
]
Many to many
Senaryo: Bir kullanıcı birden çok role sahip olabilir. Bir rol de birden çok kullanıcıya ait olabilir.
İstenen: Verilen kullanıcı id'sine göre kullanıcının rollerine ulaşmak
Yapılacak işlemler:
- roles tablomuzu açıp yeni kayıtlar ekliyoruz
- (id: 1, name: Admin)
- (id: 2, name: Moderatör)
- role_user tablomuzu açıp yeni kayıtlar ekliyoruz;
- (id: 1, user_id: 1, role_id: 1)
- (id: 2, user_id: 1, role_id: 2)
- Role modelimizi oluşturuyoruz;
php artisan make:model Role
- User modelimize gerekli fonksiyonu ekliyoruz;
public function roles()
{
return $this->belongsToMany('App\Role')->select('name');
}
- api.php dosyamızı açıp gerekli route tanımını yapıyoruz;
Route::get('user_roles/{user_id}', 'UserController@user_roles');
- UserController dosyamızı açıp gerekli fonksiyonu ekliyoruz;
public function user_roles($user_id)
{
$user = User::find($user_id);
return $user->roles;
}
Sonuç:
Gerekli komutu çalıştırıyoruz;
php artisan serve
Postman üzerinden isteği yapıyoruz;
- Link: http://localhost:8000/api/user_roles/1
- Metod: GET
- Cevap:
[
{
"name": "Admin",
"pivot": {
"user_id": 1,
"role_id": 1
}
},
{
"name": "Moderatör",
"pivot": {
"user_id": 1,
"role_id": 2
}
}
]
Has many through
Senaryo: Bir kullanıcının bir ülkesi ve birden çok makalesi olabilir.
İstenen: Verilen ülke id'sine göre o ülkedeki makalelere ulaşmak
Yapılacak işlemler:
- countries tablomuzu açıp yeni kayıtlar ekliyoruz;
- (id: 1, name: Türkiye)
- (id: 2, name: Amerika)
- users tablomuzu açıp düzenleme yapıyoruz:
- (id: 1, name: Yusuf, county_id: 1)
- (id: 2, name: Jack, county_id: 2)
- Country modelimizi oluşturuyoruz;
php artisan make:model Country
- Country modelimize gerekli fonksiyonu ekliyoruz;
public function articles()
{
return $this->hasManyThrough('App\Article', 'App\User', 'country_id', 'user_id');
}
- api.php dosyamızı açıp gerekli route tanımını yapıyoruz;
Route::get('country_posts/{country_id}', 'UserController@country_posts');
- UserController dosyamızı açıp gerekli fonksiyonu ekliyoruz;
public function country_posts($country_id)
{
$country = Country::find($country_id);
return $country->articles;
}
Sonuç:
Gerekli komutu çalıştırıyoruz;
php artisan serve
Postman üzerinden isteği yapıyoruz;
- Link: http://localhost:8000/api/country_posts/1
- Metod: GET
- Cevap:
[
{
"id": 1,
"user_id": 1,
"title": "Makale-1",
"body": "Makale-1'in içeriği",
"created_at": "2019-06-19 11:16:05",
"updated_at": "2019-06-19 11:16:06",
"laravel_through_key": 1
},
{
"id": 2,
"user_id": 1,
"title": "Makale-2",
"body": "Makale-2'nin içeriği",
"created_at": "2019-06-19 11:16:19",
"updated_at": "2019-06-19 11:16:20",
"laravel_through_key": 1
}
]
Umarım faydalı olmuştur.
İyi çalışmalar...

Yorumlar 2 yorum yapıldı.
Yeni Yorum