menu

Laravel - Doctrine


Pada tutorial kali ini kita akan membahas tentang doctrine, doctrine merupakan sebuah plugin yang dapat digunakan pada laravel yang sangat berguna sebagai ORM (Object Relational Mapper). ORM sendiri merupakan teknik untuk memetakan tabel dari database menjadi objek php.

Doctrine dalam hal ini akan kita gunakan sebagai pengganti dari migration pada laravel, jika pada migration laravel kita akan sangat sulit dalam mengedit sebuah nama kolom pada tabel ataupun menambah kolom baru tanpa mengubah isi tabel, dengan doctrine semua itu akan sangat mudah dilakukan.

Eksperimen ini akan dilakukan dengan menggunakan laravel 5.4, php 5.6, dan dengan MacOS, pastikan php yang terinstall pada komputer anda adalah versi 5.6 karena jika anda menginstall php 7.* akan banyak masalah pada doctrinenya nanti.

Oke langsung saja kita mulai experimennya,

Pertama install dulu laravelnya versi 5.4 lihat disini, dan cek versi php "php -v" pada terminal.


Selanjutnya, install laravel doctrine dengan cara ikuti ketiga langkah dibawah ini,
  1. Install ORM doctrine
  2. Install Extension doctrine
  3. Install Migration doctrine
Jika sudah tambahkan folder doctrine pada path database/migrations/ sehingga akan tampak seperti ini,


Dan edit file migrations.php pada path config/ ubah directory menjadi seperti ini,


Kemudian tambahkan juga folder Entities pada path app/ sehingga akan tampak seperti ini,


Aktifkan extensions SoftDeletes dengan mengedit file doctrine.php pada path config/ seperti ini,



Folder Entities merupakan tempat mapping semua tabel, sekarang buat file baru pada folder Entities dengan nama User.php dan isikan code berikut,

<?php

namespace App\Entities;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 * @Gedmo\SoftDeleteable(fieldName="deleted_at", timeAware=false)
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string", unique=true)
     */
    protected $email;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=true)
     */
    protected $name;

    /**
     * @var \DateTime
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(type="datetime")
     */
    protected $created_at;

    /**
     * @var \DateTime
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(type="datetime")
     */
    protected $updated_at;

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime", nullable=true)
     */
    protected $deleted_at;
}

Setelah itu jalankan doctrine dengan cara,

$php artisan doctrine:migration:diff
$php artisan doctrine:migration:migrate


Sehingga akan membuat sebuah tabel users seperti pada gambar dibawah ini,


Sekarang coba isi tabel tersebut dengan sembarang data misal seperti ini,


Tes doctrine pertama coba kita edit nama kalom name menjadi edit dengan cara edit file User.php pada path app/Entities/ menjadi seperti ini,

<?php

namespace App\Entities;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 * @Gedmo\SoftDeleteable(fieldName="deleted_at", timeAware=false)
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string", unique=true)
     */
    protected $email;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=true)
     */
    protected $name_edit;

    /**
     * @var \DateTime
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(type="datetime")
     */
    protected $created_at;

    /**
     * @var \DateTime
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(type="datetime")
     */
    protected $updated_at;

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime", nullable=true)
     */
    protected $deleted_at;
}

Jalankan kembali migration doctrinenya lagi dengan cara yang sama seperti sebelumnya, dan hasilnya akan tampak seperti dibawah ini,


Tes doctrine selanjutnya yaitu menambah kolom address pada tabel users  dengan cara edit file User.php kembali menjadi seperti ini,

<?php

namespace App\Entities;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 * @Gedmo\SoftDeleteable(fieldName="deleted_at", timeAware=false)
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string", unique=true)
     */
    protected $email;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=true)
     */
    protected $name_edit;

    /**
     * @var string
     * @ORM\Column(type="text", nullable=true)
     */
    protected $address;

    /**
     * @var \DateTime
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(type="datetime")
     */
    protected $created_at;

    /**
     * @var \DateTime
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(type="datetime")
     */
    protected $updated_at;

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime", nullable=true)
     */
    protected $deleted_at;
}

Jalankan kembali migration doctrinenya lagi dengan cara yang sama seperti sebelumnya, dan hasilnya akan tampak seperti dibawah ini,


Dapat dilihat kan perubahannya, sangat mudah untuk mengedit tabel database pada server production jika suatu saat nanti terdapat perubahan.

===DONE!===