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