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.


Örnek proje linki


İ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...