menu

Laravel - Relasi tabel pada database


Hello, kembali lagi codedoct akan share ilmu tentang laravel,

Kali ini codedoct akan membahas cara membuat sebuah relasi tabel pada database menggunakan migration laravel. caranya dengan menambahkan foreign key pada suatu tabel dan tabel tersebut langsung dapat berelasi dengan tabel lain.

Jangan lupa tutorial ini merupakan lanjutan dari tutorial sebelumnya, sehingga untuk mempraktekan tutorial ini anda harus mempraktekkan tutorial2 sebelumnya agar tidak terjadi error.

Oke dari pada bingung, kita langsung saja mulai prakteknya.

Pertama, buat migrate baru dengan cara seperti pada gambar dibawah,


Selanjutnya, buka file hasil migrate:make pada path protected/app/database/migrations/<tanggal>_create_addresses_table.php dan edit menjadi seperti ini,
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAddressesTable extends Migration {

 /**
  * Run the migrations.
  *
  * @return void
  */
 public function up()
 {
  Schema::create('addresses', function($table){
   $table->integer('id', true);
   $table->integer('user_id')->index('addresses_user_id')->nullable();
   $table->string('name_address');
   $table->string('city');
   $table->string('province');
   $table->string('address');
   $table->integer('zipcode');
   $table->string('phone');
   $table->timestamps();
   $table->softDeletes();
  });

  Schema::table('addresses', function(Blueprint $table)
        {
            $table->foreign('user_id', 'addresses_ibfk_1')->references('id')->on('users')->onUpdate('CASCADE')->onDelete('CASCADE');
        });
 }

 /**
  * Reverse the migrations.
  *
  * @return void
  */
 public function down()
 {
  Schema::table('addresses', function(Blueprint $table)
  {
   $table->dropForeign('addresses_ibfk_1');
  });

  Schema::drop('addresses');
 }

}

Kemudian, edit file <tanggal>_create_users_table.php pada path protected/app/database/migrations/ menjadi seperti ini,
<?php
//ini database laravel
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

 /**
  * Run the migrations.
  *
  * @return void
  */
 public function up()
 {
  Schema::create('users', function($table){
   $table->integer('id', true);
   $table->string('name');
   $table->string('username')->unique('users_username');
   $table->string('email')->unique('users_email');
   $table->string('password');
   $table->string('remember_token', 100)->nullable();
   $table->timestamps();
   $table->softDeletes();
  });
 }

 /**
  * Reverse the migrations.
  *
  * @return void
  */
 public function down()
 {
  Schema::drop('users');
 }

}

Setelah itu, edit pula file UserSeeder.php pada path protected/app/database/seeds/ menjadi seperti ini,
<?php
 
class UserSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->delete();
        DB::table('users')->insert(array (
            array (
                'name'     => 'Dracule Mihawk',
                'username' => 'mihawk',
                'email'    => 'mihawk@gmail.com',
                'password' => Hash::make('rahasiakampret'),
            ),
            array (
                'name'     => 'Trafalgar Law',
                'username' => 'trafa',
                'email'    => 'trafa@gmail.com',
                'password' => Hash::make('rahasiakampret'),
            ),
        ));
    }
}

Selanjutnya, buat file seeder baru dengan nama AddressSeeder.php letakkan pada path protected/app/database/seeds/ isi dengan code berikut,
<?php
 
class AddressSeeder extends Seeder
{
    public function run()
    {
        DB::table('addresses')->delete();
        DB::table('addresses')->insert(array (
            array (
                'id' => 1,
                'user_id' => 1,
                'name_address'     => 'Alamat Mihawk',
                'city' => 'north blue',
                'province'    => 'fusa',
                'address' => 'jalan-jalan 1',
                'zipcode' => '12456',
                'phone' => '0982345432',
            ),
            array (
                'id' => 2,
                'user_id' => 2,
                'name_address'     => 'Alamat Law',
                'city' => 'konoha',
                'province'    => 'wano',
                'address' => 'jalan-jalan 2',
                'zipcode' => '12344',
                'phone' => '0987651245',
            ),
        ));
    }
}

Terakhir edit file DatabaseSeeder.php pada path protected/app/database/seeds/ menjadi seperti ini,
<?php

class DatabaseSeeder extends Seeder {

 /**
  * Run the database seeds.
  *
  * @return void
  */
 public function run()
 {
  // Eloquent::unguard();
  DB::statement('SET FOREIGN_KEY_CHECKS=0;');

  $this->call('UserSeeder');
  $this->call('AddressSeeder');

  DB::statement('SET FOREIGN_KEY_CHECKS=1;');
  \Cache::flush();
 }

}

Karena kita menambahkan foreign key maka field database pada phpmyadmin harus di hapus semua terlebih dahulu, caranya seperti ini,

1. Hapus semua field


2. Uncentang Enable foreign key checks


Setelah itu jalankan terminal, masuk path project dan jalankan sintax berikut,


Sehingga hasilnya akan tampak seperti ini,


Pada gambar diatas merupakan tabel addresses jika kita mengklik field user_id maka akan berelasi ke tabel users.

===DONE!===

WHY?
1. Terjadi error foreign key constraint?


Ini terjadi karena format field index anda salah, yang benar adalah integer seperti pada gambar dibawah,