Selasa, 10 Februari 2015

Relasi Database dengan Eloquent di Laravel

Pasti anda pernah mengalami kasus ingin menampilkan nama atau detail berdasar id dari tabel lain misalnya pada tabel barang terdapat id_supplier dengan value 1 , kamu ingin menampilkan siapa sih supplier itu beserta detail nya seperti nama,alamat,tlp dll. nah itu harus menggunakan relasi antar tabel
kali ini saya akan membahas penggunaan relasi pada laravel menggunakan Eloquent,
  • Buat sebuah project laravel baru , sebagai contoh berinama 'relasi' . dengan composer create-project laravel/laravel relasi-laravel --prefer-dist  kalau anda bingung baca Instalasi Laravel.
  • Siapkan database yang akan digunakan dan lakukan configurasi di app/config/database.php 
  • Buat 2 buah tabel berinama barang dan pemasok,  copas saja  script slq dibawah .
 CREATE TABLE IF NOT EXISTS `barang` (
`id_barang` int(11) NOT NULL,
 `nama` varchar(255) NOT NULL,
 `jumlah` int(11) NOT NULL,
 `id_pemasok` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

INSERT INTO `barang` (`id_barang`, `nama`, `jumlah`, `id_pemasok`) VALUES
(1, 'Djarum Black', 4, 1),
(2, 'Mizone', 5, 1),
(3, 'Aqua 100ml', 10, 1),
(4, 'Avian', 10, 2),
(5, 'Falcon Gold', 12, 2),
(6, 'Gembok Yale', 16, 2);

CREATE TABLE IF NOT EXISTS `pemasok` (
`id_pemasok` int(11) NOT NULL,
 `nama` varchar(255) NOT NULL,
 `alamat` text NOT NULL,
 `telepon` varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

INSERT INTO `pemasok` (`id_pemasok`, `nama`, `alamat`, `telepon`) VALUES
(1, 'PT.IndoFood', 'Jl.Papandayan Bandung', '0876637182'),
(2, 'PT.Barokah Jaya', 'Jl.Cimanuk Garut', '08384758945');

Relasi One to One

- Model
Buat 2 model baru dengan nama Barang dan Pemasok pada direktori app/models/
Model Barang 
app/models/Barang.php
class Barang extends Eloquent {

 protected $table = 'barang'; //Mendefinisikan tabel terkait
 protected $primaryKey = 'id_barang'; //Mendefinisikan primaryKey dari tabel terkait

 //Buat function baru yang nantinya akan dipanggih
 public function pemasok() {
 //Relasi one to one menggunakan fungsi belongsTo
 // Barang adalah nama class yang akan direlasikan
 // id_pemasok maksudnya merelasikan berdasarkan id_pemasok yang ada di tabel barang
 return $this->belongsTo('Pemasok', 'id_pemasok');
 }

}
Model Pemasok
app/models/Pemasok.php
 class Pemasok extends Eloquent {

 protected $table = 'pemasok'; //Mendefinisikan tabel terkait
 protected $primaryKey = 'id_pemasok'; //Mendefinisikan primaryKey dari tabel terkait

}
- Route
Disini kita akan menampilkan field dari database dengan memanfaatkan relasi yang ada.
 Route::get('relasi-1', function()
 {
  $query = Barang::where('id_barang',1)->first();

  return $query->pemasok->nama;
});
Penjelasan dari script di atas :
  • $query berisi satu record barang yang diambil berdasarkan id_barang
  • pemasok function yang ada pada model Barang.
  • nama field yang ingin ditampilkan dari tabel pemasok
- Output

Relasi One to Many

- Model
Untuk model barang biarkan dulu seperti itu , kita akan melakukan sedikit perubahan pada model Pemasok  yaitu menambahkan function bernama barang.
- Model Pemasok
app/models/Pemasok.php
 class Pemasok extends Eloquent {

 protected $table = 'pemasok'; //Mendefinisikan tabel terkait
 protected $primaryKey = 'id_pemasok'; //Mendefinisikan primaryKey dari tabel terkait

 //Buat function baru yang nantinya akan dipanggih
 public function barang() {
 //Relasi one to one menggunakan fungsi belongsTo
 // Barang adalah nama class yang akan direlasikan
 // id_pemasok maksudnya merelasikan berdasarkan id_pemasok yang ada di tabel barang
 return $this->hasMany('Barang', 'id_pemasok');
 }

}
- Route
Disini kita akan menampilkan barang berdasarkan pemasok.
 Route::get('relasi-2',function(){

 $pemasok = Pemasok::where('id_pemasok',1)->first();
     echo 'Pemasoknya : '. $pemasok->nama;

 foreach ($pemasok->barang as $data)
     echo '<li> Barang : ' . $data->nama .'</li>';

});
Penjelasan :
  • foreach menampilkan data barang 
  • $pemasok->barang mengambil semua data barang yang berdasarkan pemasok terkait.
  • $data->nama field yang ditampilkan dari tabel barang.   
 - Output

 Relasi Many to Many

Penerapan relasi many to many dalam pembahasan ini kita membuat 3 buah tabel baru yaitu post , tag dan tag_relasi,
 CREATE TABLE IF NOT EXISTS `post` (
`id_post` int(11) NOT NULL,
 `judul` varchar(255) NOT NULL,
 `content` text NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `post`
--

INSERT INTO `post` (`id_post`, `judul`, `content`) VALUES
(1, 'Membuat Relasi dengan Eloquent di Laravel', 'cara membuat relasi dengan eloquent adalah bla bla bla '),
(2, 'Tutorial PHP dan Mysql', 'php dan mysql adalah sesuatu yang tidak bisa dipisahkan dalam sistem informasi.......'),
(3, 'Tutorial database mySql', 'cara menggunakan database sql adalah bla, bla, bla'),
(4, 'Tutorial array dengan PHP', 'caranya adalah bla, bla, bla '),
(5, 'Tutorial Laravel pemula', 'Laravel adalah ....');

CREATE TABLE IF NOT EXISTS `tag` (
`id_tag` int(11) NOT NULL,
 `tag` varchar(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `tag`
--

INSERT INTO `tag` (`id_tag`, `tag`) VALUES
(1, 'laravel'),
(2, 'framework'),
(3, 'eloquent'),
(4, 'database'),
(5, 'php'),
(6, 'Sql');

CREATE TABLE IF NOT EXISTS `tag_relasi` (
 `id_tag` int(11) NOT NULL,
 `id_post` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `tag_relasi`
--

INSERT INTO `tag_relasi` (`id_tag`, `id_post`) VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 2),
(4, 2),
(4, 3),
(5, 4),
(6, 1),
(6, 2),
(1, 5);
- Model Post
 class Post extends Eloquent {

   protected $table = 'post'; #Deklarasikan nama tabel
   protected $primaryKey = 'id_post'; #Deklarasikan primary key dari tabel terkait

 # buat function baru berinama tag
 # Many to many menggunkan fungsi belongsToMany
 # Tag adalah model , tag_relasi tabel pivot

 public function tag() {
      return $this->belongsToMany('Tag', 'tag_relasi', 'id_post', 'id_tag');
 }

}
- Model Tag
 class Tag extends Eloquent {

 protected $table = 'tag';
 protected $primaryKey = 'id_tag';

 # buat function baru berinama post
 # Many to many menggunkan fungsi belongsToMany
 # Post adalah model , tag_relasi tabel pivot
 
 public function post() {
 return $this->belongsToMany('Post', 'tag_relasi', 'id_tag', 'id_post');
 }

}
Untuk tabel tag_relasi tidak perlu dibuatkan model karena hanya merupakan tabel pivot (perantara).
- Route
Pada route relasi-4  menampilkan tag berdasarkan post dan route relasi-5 menampilkan post berdasarkan tag
 Route::get('relasi-4', function() {

 # panggil post berdasarkan id 
 $post = Post::where('id_post', '=', '1')->first();

 echo 'Post nya : '.$post->judul .'<br>';
 
 # Tampilkan seluruh tag post tersebut
 foreach ($post->tag as $data) 
 echo '<li>' . $data->tag . '</li>';
 });

Route::get('relasi-5', function() {

 # Temukan tag laravel
 $tag = Tag::where('tag', '=', 'laravel')->first();
 echo 'Tag nya : '.$tag->tag .'<br>';
 
 # Tampilkan semua posting dengan tag laravel
 foreach ($tag->post as $data)
 echo '<li> Judul : ' . $data->judul . ' <strong>' . $data->content . '</strong></li>';

 });
- OUTPUT
Relasi 4

Relasi 5

 Selesai sudah pembahasan tentang 3 Relasi di atas , sebenarnya masih ada jenis relasi lain tapi mungkin lain waktu akan di posting tutorialnya..

Sumber : Ilmuwebsiteku.com Relasi dengan database Eloquent

3 komentar: