Digitalmapia adalah situs dimana semua orang bisa menulis artikelnya sendiri. Klik "Login/Register untuk masuk, lalu klik "Tulis Artikel" untuk mulai menulis.

Mengenal CRUD dan Relationship pada Eloquent ORM Laravel

Eloquent adalah sebuah ORM (Object Relational Mapping) yang sangat powerful dan expressive. Jika anda pernah bekerja dengan object pada php, maka anda tidak akan terlalu kesulitan bekerja dengan Eloquent ORM.

Pada Laravel, setiap model (yang merupakan turunan dari Eloquent) mewakili sebuah table pada database. Namun, perlu diingat meskipun sebuah model mewakili sebuah tabel, dalam prakteknya kita seringkali menggunakan beberapa model untuk mengambil data. Dengan menggunakan relationship kita bisa melakukan pengambilan data dari banyak tabel sekaligus.

Kadangkala, saat menggunakan Laravel kita tidak menggunakan eloquent, tetapi menggunakan class bernama DB. Bahkan dengan cara demikian, kita tidak perlu membuat model. Hal ini sah-sah saja, namun alangkah bijaknya jika menggunakan eloquent model. Dengan menggunakan eloquent model, program yang kita buat bisa lebih rapi dan mudah dibaca dan juga tentu saja lebih cepat serta mudah digunakan kembali.

Membuat Eloquent Model

Kali ini kita akan membuat dua buah Model bernama ‘Penulis’ dan ‘Artikel’. Namun sebelumnya, terlebih dahulu buat database bernama Orang dan Artikel dengan menggunakan Migrasi sebagai berikut:

<?php

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

class CreateArticlesTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('judul');
            $table->text('body');
            $table->integer('author_id');
            $table->timestamps();
        });
    }

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

}
?>
<?php

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

class CreateAuthorsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('authors', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('username')->unique();
            $table->text('bio');
            $table->timestamps();
        });
    }

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

}
?>

Setelah migrasi dibuat, kemudian jalankan perintah php artisan migrate pada command-line. Lalu, buatlah sebuah model sebagai berikut:

<?php class Author extends Eloquent {} ?>

Model kemudian disimpan pada file app/models/Author.php. Model diatas secara otomatis dimapping kepada tabel bernama ‘authors’ yang telah kita buat sebelumnya dengan menggunakan migrasi. Proses mapping secara otomatis mengikuti aturan tunggal dan jamak dalam bahasa inggris dimana nama class model menggunakan kata tunggal (contoh ‘Author’, ‘User’, dsb) sedangkan nama tabel di database menggunakan kata jamak (contoh ‘authors’, ‘users’ dsb).

Create

Dengan menggunakan eloquent, kita bisa memasukan data ke dalam database dengan berbagai cara. Berikut adalah cara yang paling sering saya gunakan:

// app/routes.php

Route::get('/', function()
{
    $author = new Author;  
    $author->username = 'Sleeping Komodo';
    $author->bio = 'Saya adalah orang yang ganteng';
    $author->save();    
});

Select

Berikut adalah cara melakukan select menggunakan eloquent:

// app/routes.php

Route::get('/', function()
{
    $authors = Author::all()->first();

    echo $authors->username;
    echo $authors->bio;

});

Fungsi first digunakan untuk mengambil hanya record yang pertama dari data yang ada pada query select. Untuk mengambil semua data, cukup hilangkan method first tersebut, setelah itu data bisa ditampilkan dengan menggunakan foreach:

// app/routes.php

Route::get('/', function()
{
    $authors = Author::all();

    foreach($authors as $author)
    {
       echo $author->username;
       echo $author->bio;
    } 
});

Update

Mari kita lanjutkan ke fungsi selanjutnya, yaitu update. Saya akan merubah nama author yang tadinya ‘Sleeping Komodo’ menjadi ‘Sleeping Komodo ganteng’. Seperti kita ketahui, setiap record pada tabel ‘authors’ memiliki id yang di-generate secara otomatis menggunakan auto-increment. Kali ini anggap saya record yang akan kita ubah memiliki id = 1, maka kode untuk melakukan update menjadi sebagai berikut:

// app/routes.php

Route::get('/', function()
{
    $author = Author::find(1); //Temukan author dengan id = 1

    $author->username = 'Sleeping Komodo Ganteng';
    $author->bio = 'Saya adalah orang yang ganteng';

    $author->save();    
});

Perhatikan bahwa contoh diatas hampir sama dengan contoh ketika kita melakukan create. Bedanya kita menggunakan Author::find(1) untuk menginisialisasi variabel $author.

Delete

Delete adalah yang paling mudah. Berikut contoh penggunaan delete pada eloquent:

// app/routes.php

Route::get('/', function()
{
    $author = Author::find(1); //Temukan author dengan id = 1

    $author->delete();    
});

Relationship menggunakan eloquent

Relationship adalah komponen utama pada eloquent. Sebelum mempelajari relationship marilah terlebih dahulu menambahkan data-data berikut pada tabel authors:

Route::get('/', function()
{
    $author = new Author;  
    $author->username = 'Benny Ibrahim';
    $author->bio = 'Seorang penulis buku';
    $author->save();    

    $author = new Author;  
    $author->username = 'Adam Saefullah';
    $author->bio = 'Seorang penulis artikel';
    $author->save();    

    $author = new Author;  
    $author->username = 'Willy Alghifari';
    $author->bio = 'Seorang penulis blog';
    $author->save();    
});

Setelah anda jalankan kode diatas, maka 3 record baru akan dimasukan ke dalam database. Kemudian ubah route diatas menjadi sebagai berikut:

Route::get('/', function()
{
    $author = Author::find(1);

    $article = new Article;
    $article->title = 'Perjalanan ke pulau harapan';
    $article->body  = 'Perjalanan ke pulau harapan menjadi sangat menarik karena adanya rombongan fotografer yang ikut bersama kami
    sehinga momen perjalanan kami bisa diabadikan';
    $article->author_id = $author->id;
    $article->save();

    $article2 = new Article;
    $article2->title = 'Perjalanan ke pulau harapan versi 2';
    $article2->body  = 'Perjalanan ke pulau harapan menjadi sangat menarik karena adanya rombongan fotografer yang ikut bersama kami
    sehinga momen perjalanan kami bisa diabadikan versi 2';
    $article2->author_id = $author->id;
    $article2->save();

});

Setelah kode diatas, dijalankan ganti $author = Author::find(1); menjadi $author = Author::find(2); kemudian jalankan lagi. Setelah itu, itu ganti lagi menjadi $author = Author::find(3); lalu jalankan lagi dan seterusnya sebanyak jumlah author yang ada di database sehingga, setiap author memiliki dua article.

Menggunakan hasMany

Seorang penulis (author) biasanya memiliki banyak artikel. Pada Laravel, kita bisa mendefinisikan relationship sebagai berikut:

<?php
class Author extends Eloquent {

    public function articles()
    {
        return $this->hasMany('Article');
    }

}
?>

Jika kode tersebut diterjemahkan ke dalam bahasa manusia maka akan menjadi ‘this author has many article / author ini memiliki banyak artikel’. Cukup mudah dipahami bukan?

Menggunakan belongsTo

<?php
class Article extends Eloquent {

    public function author()
    {
        return $this->belongsTo('Author');
    }

} ?>

Kita juga bisa menerjemahkan method belongsTo ini ke dalam bahasa manusia menjadi ‘this article belongs to author / artikel ini dimiliki oleh satu author’. Lumayan simple kan ? 😀

Menggunakan dynamic method

Sekarang, setelah anda membuat relationship pada model, kita bisa melakukan select terhadap data yang ada pada tabel bersangkutan, tentunya dengan memanfaatkan relationship tersebut. Sebagai contoh saya akan mengambil article dengan nama penulis ‘Benny Ibrahim’ maka saya bisa melakukannya dengan cara sebagai berikut:

Route::get('/', function()
{
    $author = Author::whereUsername('Benny Ibrahim')->first();

    foreach($author->articles as $article){
        echo $article->title;
        echo $article->body;
    }

});

Perhatikan, pada contoh diatas kita menggunakan method whereUsername. Jika anda pernah melihat dokumentasi Laravel, maka anda tidak akan pernah menemukan method tersebut. Karena method tersebut adalah method dinamis (dynamic method) dimana kita mengkombinasikan kata ‘where’ dengan nama kolom yang ingin kita gunakan (‘username’). Jadi, jika anda ingin memfilter data berdasarkan kolom dengan nama ‘umur’, maka anda bisa menggunakan whereUmur, jika berdasarkan kolom jabatan = whereJabatan dan seterusnya.

Sekarang mari kita lakukan kebalikannya, kita mengambil nama penulis yang menulis article dengan judul ‘Perjalanan ke pulau harapan’.

Route::get('/', function()
{
    $article = Article::whereTitle('Perjalanan ke pulau harapan')->first();

    echo $article->author->username;
    echo $article->author->bio;

});

Perhatikan bahwa model yang digunakan pada contoh diatas adalah ‘Article’ dimana kita bisa mengakses kolom-kolom dari tabel ‘authors’ dengan mudah tanpa harus menginisisasi model Author dengan menggunakan $authors = Author::all() dsb.

Contoh lain untuk cara mengambil data menggunakan relationship adalah sebagai berikut:

Route::get('/', function()
{
    $articles = Article::all();

    foreach($articles as $article){
        echo $article->author->username;
        echo ' menulis artikel berjudul ';
        echo $article->title;
    }

});

Perhatikan, bahwa cara diatas akan berjalan sangat lambat terutama terutama ketika menangani data dalam jumlah yang banyak, karena kueri yang digunakan secara background tidak efektif dan terdiri dari beberapa kueri. Misalnya, jika terdapat 10 data, maka akan diselect satu-satu sehingga terdapat 10 kueri. Sebagai alternatif, gunakan cara sebagai berikut:

Route::get('/', function()
{
    $paintings = Painting::with('author')->get();

    foreach($articles as $article){
        echo $article->author->username;
        echo ' menulis artikel berjudul ';
        echo $article->title;
    }

});

Dengan cara tersebut kueri yang digunakan bisa lebih sedikit yaitu hanya menjadi 2 query saja. Anda bisa melihat jumlah query yang digunakan dengan men-trace sendiri.

Semoga bermanfaat.

Laravel Wallpapper
  • http://www.nurulimam.com/ Nurul Imam

    Sekarang laravel sudah mendominasi framework php yah, ci malah melempem 😀

    • http://digitalmapia.com/ digitalmapia

      Yups, sudah mulai naik daun gan 😀

  • Yogi Boget

    bang yang ini apa maksudnya

    $paintings = Painting::with(‘author’)->get();

    kan dalam Model tidak ada class Painting.,, mohon pencerahannya bang., 😀 masih newbie