Logo Universitas

Universitas ASA Indonesia

Program Studi: Teknologi Informasi

Mata Kuliah: Pengembangan Aplikasi Web Lanjut

SKS: 3 (2 teori, 1 praktikum)

Dosen Pengampu: Istiqomah Sumadikarta, S.T., M.Kom.

Beranda Mundur Maju

Pertemuan 2: Database

Konfigurasi Koneksi Database di Laravel


Karena website yang kita akan bangun bersifat dinamis, maka kita perlu menggunakan sebuah database untuk menyimpan data tersebut, dimana data tersebut dapat kita manipulasi sesuai dengan keinginan, seperti menambah, edit dan hapus. Di Laravel untuk menghubungkan ke dalam database sangatlah mudah, kita cukup mendefinisikan beberapa konfigurasi di dalam file .env, maka website kita sudah bisa terhubung dengan database.

Langkah 1 - Konfigurasi Koneksi Database di Laravel

Sekarang kita akan belajar bagaimana cara menghubungkan project website travel wisata dengan database, silahkan buka file .env dan cari kode berikut ini :

DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

Dan ubahlah menjadi seperti berikut ini :

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_laravel_travel
DB_USERNAME=root
DB_PASSWORD=

Di atas, kita atur untuk DB_DATABASE menggunakan db_laravel_travel dan untuk DB_PASSWORD silahkan disesuaikan dengan konfigurasi dari masing-masing MySQL yang digunakan, jika menggunakan XAMPP, secara default adalah kosong atau kita tidak perlu mengisinya.

Sekarang kita lanjutkan membuat databasenya melalui PhpMyAdmin. Silahkan aktifkan fitur MySQL di XAMPP (Jika menggunakan XAMPP) dan buka link berkut ini di dalam web browser : http://localhost/phpmyadmin dan silahkan buat database baru dengan nama db_laravel_travel, kurang lebih seperti berikut ini :

Membuat Model dan Migration


Model merupakan salah satu bagian dari arsitektur MVC. Jadi apa sih MVC itu ? jadi di dalam kebanyakan framework pasti menggunakan arsitektur/pola yang disebut MVC atau kepanjangan dari (Model, View dan Controller).

Laravel juga menerapkan arsitektur/pola MVC di dalam core system-nya, dengan menggunakan arsitektur ini maka proses pembuatan aplikasi akan dipisahkan berdasarkan fungsinya masing-masing.

  1. Model merupakan bagian yang digunakan untuk menangani query data dari database.
  2. View digunakan untuk menampilkan sesuatu di layar web browser, biasanya berupa kode-kode seperti HTML, CSS dan JavaScript.
  3. Controller digunakan untuk menangani logika dari aplikasi dan berperan untuk menghubungkan antara Model dengan View.

Sedangkan untuk Migration merupakan fitur yang ada di dalam framework Laravel, yang digunakan untuk membuat version control database. Dimana kita bisa membuat schema database dan membagikannya dengan tim yang lain secara mudah. Jika sebelumnya kita membuat attribute secara manual di dalam database, maka dengan migration kita tidak perlu melakukan hal seperti itu lagi, seperti membuat table, menambahkan attribute, mengubah tipe data dan lain-lain.

Pada bab perancangan dan materi struktur database, kita sudah melihat beberapa table-table yang akan kita gunakan nantinya dan kali ini kita akan belajar bagaimana cara membuat Model dan juga Migration untuk melakukan generate table-table tersebut ke dalam database.

INFORMASI : By default Laravel sudah membuatkan kita Model dan Migration User yang nanti akan di generate manjadi table users di dalam database, jadi kita tidak perlu membuatnya lagi secara manual.

Langkah 1 - Membuat Model dan Migration Categories

Laravel mempermudah para developer dalam membuat sebuah fitur menggunakan perintah CLI (command line interface) dari artisan, termasuk membuat Model dan juga Migration.

Sekarang kita coba untuk membuat sebuah Model dan juga Migration untuk table categories, silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya :

php artisan make:model Category -m

Perintah di atas, digunakan untuk melakukan generate sebuah Model dengan nama Category dan karena kita menambahkan flag -m, maka kita juga akan menyertakan sebuah Migration-nya.

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru di dalam project Laravel, yang berad di dalam folder :

INFORMASI : untuk nama file migration akan diambil dari tanggal pembuatannya.

Sekarang kita akan lanjutkan untuk menambahkan beberapa kode di dalam file Model dan jug Migration. Silahkan buka file database/migrations/2025_05_15_011402_create_categories_table.php, kemudian ubah pada bagian function up menjadi seperti berikut ini :

public function up(): void
{
   Schema::create('categories', function (Blueprint $table) {
      $table->id();
      $table->string('name');
      $table->string('slug');
      $table->string('image');
      $table->timestamps();
   });
}

Dari perubahan yang kita lakukan di atas, kurang lebih kita menambahkan 3 attribute baru, yaitu :

ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
name string - untuk menyimpan nama category.
slug string - untuk membuat URL friendly.
image string - untuk menyimpan nama gambar.

Setelah berhasil menambahkan beberapa attribute di dalam file migration, maka sekarang kita lanjutkan untuk menambahkaan mass assignment di dalam file model. Tujuannya agar attribute yang sudah kita tambahkan di atas dapat melakukan manipulasi data, seperti proses insert, update dan delete.

Silahkan buka file app/Models/Category.php dan ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'name', 'slug', 'image'
    ];
}

Di atas kita menambahkan properti $fillable, dimana properti tersebut digunakan untuk mass assignment dari attribute yang sudah kita tambahkan di file migration.

Langkah 2 - Membuat Model dan Migration places

Kita lanjutkan untuk membuat Model dan Migration untuk data places. silahkan jalankan perintah berikut ini di dalam terminal/CMD dan tentu saja pastikan sudah berada di dalam project Laravel.

php artisan make:model Place -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru yang berada di dalam folder :

Setelah itu, kita akan lanjutkan menambahkan beberapa attribute di dalam file migration. Silahkan buka file migration places yang berada di database/migrations/2025_05_15_011443_create_places_table.php dan pada function up ubah kode-nya menjadi seperti berikut ini :

public function up(): void
{
   Schema::create('places', function (Blueprint $table) {
      $table->id();
      $table->string('title');
      $table->string('slug');
      $table->unsignedBigInteger('user_id');
      $table->unsignedBigInteger('category_id');
      $table->text('description');
      $table->string('phone');
      $table->string('website');
      $table->string('office_hours');
      $table->text('address');
      $table->string('longitude');
      $table->string('latitude');
      $table->timestamps();

      //relationship category
      $table->foreign('category_id')->references('id')->on('categories');

      //relationship user
      $table->foreign('user_id')->references('id')->on('users');
   });
}

Dari perubahan kode di dalam file migration di atas, kita menambahkan 11 attribute, yaitu :

ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
title string - untuk menyimpan judul place.
slug string - untuk membuat URL friendly.
user_id unsignedBigInteger foreign key untuk melakukan relasi dengan table users.
category_id unsignedBigInteger foreign key untuk melakukan relasi dengan table categories.
description text - untuk menyimpan keterangan place.
phone string - untuk menyimpan no. telp.
website string - untuk menyimpan website.
office_hours string - untuk menyimpan jam kerja.
address text - untuk menyimpan alamat.
longitude string - untuk menyimpan kordinat longitude dari maps.
latitude string - untuk menyimpan kordinat latitude dari maps.

Setelah itu, kita juga menambahkan 2 relasi, yaitu :

//relationship category
$table->foreign('category_id')->references('id')->on('categories');

Di atas, kita mereferensikan attribute category_id sebagai foreign key ke dalam attribute id yang ada di dalam table categories.

//relationship user
$table->foreign('user_id')->references('id')->on('users');

Di atas, kita mereferensikan attribute user_id sebagai foreign key ke dalam attribute id yang ada di dalam table users.

Setelah berhasil menambahkan beberapa attribute beserta relasi di dalam file migration, maka sekarang kita akan lanjutkan untuk menambahkan mass assignment di dalam model.

Silaahkan buka file app/Models/Place.php, kemudian ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Place extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'title', 'slug', 'user_id', 'category_id', 'description', 'phone', 'website', 'office_hours', 'address', 'longitude','latitude'
    ];
}

Di atas, kita menambahkan properti $fillable, properti tersebut digunakan untuk mass assignment yang tujuannya untuk mengizinkan attribute agar bisa melakukan manipulasi data.

Langkah 3 - Membuat Model dan Migration place_images

places_images nantinya akan berupa table yang akan kita gunakan untuk menyimpan gambar-gambar dari data place. Karena kita akan buat agar 1 data place bisa memiliki banyak gambar di dalamnya. Maka kita akan jadikan table place_images berelasi ONE TO MANY dengan table places.

Silahkan jalankan perintah berikut ini di dalam terimnal/CMD dan pastikan berada di dalam project Laravel :

php artisan make:model PlaceImage -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru di dalam folder :

Sekarang kita akan menambahkan beberapa attribute di dalam file migration. Silahkan buka file migration place_images di dalam folder database/migrations/2025_05_15_011551_create_place_images_table.php dan ubah pada function up menjadi seperti berikut ini :

public function up(): void
{
   Schema::create('place_images', function (Blueprint $table) {
      $table->id();
      $table->unsignedBigInteger('place_id');
      $table->string('image');
      $table->timestamps();

      //relationship place
      $table->foreign('place_id')->references('id')->on('places');
   });
}

Dari penambahan kode di atas, kurang lebih kita menambahkan 2 attribute baru, yaitu :

ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
place_id unsignedBigInteger foreign key untuk melakukan relasi dengan table places.
image string - untuk menyimpan nama gambar.

Setelah itu, kita juga menambahkan 1 relasi, yaitu :

//relationship category
$table->foreign('place_id')->references('id')->on('places');

Di atas, kita mereferensikan attribute place_id sebagai foreign key ke dalam attribute id yang ada di dalam table places.

Setelah itu, kita akan menambahkan mass assignment di dalam model PlaceImage yang bertujuan untuk mengizinkan attribute agar bisa memanipulasi data. Silahkan buka file app/Models/PlaceImage.php, kemudian ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class PlaceImage extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'place_id', 'image'
    ];
}

Di atas, kita menambahkan properti $fillable dengan isi data attribute yang sudah kita buat sebelumnya di dalam file migration.

Langkah 4 - Membuat Model dan Migration sliders

Terakhir kita akan membuat Model dan Migration untuk sliders. Silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel.

php artisan make:model Slider -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatka 2 file baru yang berada di dalam folder :

Sekarang kita akan menambahkan attribute baru di dalam file migration sliders. Silahkan buka file tersebut di database/migrations/2025_05_15_011630_create_sliders_table.php kemudian pada function up ubah menjadi seperti berikut ini :

public function up(): void
{
   Schema::create('sliders', function (Blueprint $table) {
      $table->id();
      $table->unsignedBigInteger('user_id');
      $table->string('image');
      $table->timestamps();

      //relationship user
      $table->foreign('user_id')->references('id')->on('users');
   });
}

Dari perubahan kode di atas, kita menambahkan 2 attribute baru, yaitu :

ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
user_id unsignedBigInteger foreign key untuk melakukan relasi dengan table users.
image string - untuk menyimpan nama gambar.

Setelah itu, kita juga menambahkan 1 relasi, yaitu :

//relationship category
$table->foreign('place_id')->references('id')->on('places');

Di atas, kita mereferensikan attribute user_id sebagai foreign key ke dalam attribute id yang ada di dalam table users.

Kita lanjutkan untuk menambahkan mass assignment di dalam Model Slider. Silahkan buka file app/Models/Slider.php, kemudian ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Slider extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
       'user_id', 'image',
    ];
}

Di atas seperti sebelum-sebelumnya, kita menambahkan properti $fillable untuk mendefinisikan mass assignment, yang tujuannya agar attribute yang ada bisa melakukan manipulasi data di dalam database.

Langkah 5 - Menjalankan Proses Migrate

Setelah kita berhasil membuat beberapa file migration beserta attribute-attribute di dalamnya, maka kita akan lanjutkan untuk menjalankan proses migrate. Tujuannya agar kode-kode yang sudah kita buat di dalam file migration tersebut akan di generate menjadi sebuah table beserta attribute dan relasinya.

Silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam folder project Laravel-nya.

php artisan migrate

Di atas merupakan gambar dari proses migrate. Jika berhasil kita bisa lihat di dalam database yang ada di PhpMyAdmin, maka kita akan mendapatkan sebuah table-table berserta attribute dan relasinya.

Eloquent Relationships


Saat seorang software developer mengembangkan aplikasi yang cukup besar, tentu saja akan membutuhkan banyak table di dalamnya dan memungkinkan juga data di dalam table tersebut akan dipisah-pisah lagi ke table yang lain, itu biasanya disebut dengan normalisasi database. Seperti one-to-one, one-to-many dan many-to-many.

Karena dalam membangun aplikasi tidak mungkin kita akan menyimpan sebuah data di dalam 1 table, apalagi aplikasi yang di kembangkan sangat besar, maka dengan relasi atau normalisasi kita bisa memecahkan problem tersebut, yaitu memisahkan menjadi beberapa table yang saling berhubungan.

Di dalam Laravel kita akan sangat terbantu dengan adanya fitur Eloquent Relationship, yang bertujuan untuk mempermudah para software developer dalam melakukan normalisasi database. Berikut ini contoh normalisasi dari database.

One to one

One to one relationship terjadi jika data di dalam table A hanya boleh memiliki satu data di dalam table B (A has one B) dan data B hanya boleh dimiliki oleh data di table A (B Belongs to A).

Dalam kasus ini, kita cukup memberikan sebuah foreign key di dalam table B, dimana foreign key ini akan diisi dengan ID yang ada di dalam table A. Contohnya seperti berikut ini :

img

table users

id name
1 Fika Ridaul Maulayya
2 Rizqi Maulana
3 Yudi Purwanto

table phones

id no_telephone user_id
1 085785852224 2
2 081200046719 1
3 089223918038 3

field user_id di dalam table phones akan menyimpan nilai id dari table users, dengan begitu maka relasi one-to-one bisa terpenuhi.

One to many

One-to-many relathionship memiliki struktur relasi yang hampir sama dengan one-to-one, perbedaanya adalah satu data di dalam table A boleh memiliki banyak data di dalam table B. Contoh sederhananya adalah satu data post bisa memiliki banyak komentar.

Perbedaan antara One to Many dan One to Many (Inverse) bisa di ibaratkan contoh seperti ini :

img

Jika kita lihat dari gambar diatas antara relasi one-to-one dan one-to-many tidak ada perbedaan sama sekali, perbedaanya adalah di dalam foreign key pada table comments tidak bersifat unique, sehingga dapat menyimpan data yang sama, kalau di dalam relasi one-to-one foreign key bersifat unique, artinya tidak ada data yang boleh sama.

table posts

id title
1 Judul Post 1
2 Judul Post 2
3 Judul Post 3

table comments

id comment post_id
1 Mantap 2
2 Sukses selalu SantriKoding 2
3 Terima Kasih 3
4 Sukses tanpa ada error 1
5 Mantap bener tutorialnya 3

field foreign key post_id di dalam table comments dapat menyimpan id yang sama dari table posts, dengan begini maka relasi one-to-many dapat terpenuhi.

Many to many

Many-to-many relationships merupakan relasi dimana data di dalam table A bisa memiliki banyak data di dalam table B dan juga sebaliknya, data di dalam table B bisa memiliki banyak data di dalam table A.

Disini kita tidak dapat melakukan relasi langsung antara table A ke dalam table B, maka dari itu kita harus memiliki satu table lagi untuk menghubungkan dari kedua table tersebut, biasanya table ini di sebut dengan pivot table. Kurang lebih seperti berikut ini :

img

Dari gambar di atas bisa kita lihat bersama-sama, kita memiliki satu table lagi yang bernama post_tag, table inilah yang disebut dengan pivot table, dimana akan difungsikan untuk menyimpan id dari masing-masing table yang berhubungan.

table posts

id title
1 Judul Post 1
2 Judul Post 2

table tags

id name
1 Laravel
2 Vue Js
3 React Js
4 Node Js

table post_tag (Pivot Table)

id post_id tag_id
1 1 3
2 1 4
3 2 1
4 1 1
5 2 2

Di dalam table post_tag atau pivot table terdapat dua foreign key yaitu post_id dimana ini akan menyimpan id dari table posts dan tag_id akan menyimpan id dari table tags. Dengan begini maka bisa dikatakan sebagai relasi many-to-many.

Setelah mengetahui gambaran dasar tentang normalisasi database, maka sekarang kita akan coba implementasikan ke dalam project yang sedang kita kembangkan.

Langkah 1 - ONE TO MANY antara table users dengan table sliders

Sekarang kita akan belajar membuat relasi ONE TO MANY dari table users ke table sliders, artinya 1 user bisa memiliki banyak data slider.

Silahkan buka file app/Models/User.php, kemudian ubah kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    /** @use HasFactory<\Database\Factories\UserFactory> */
    use HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var list<string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var list<string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * Get the attributes that should be cast.
     *
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }

    /**
     * sliders
     *
     * @return void
     */
    public function sliders()
    {
        return $this->hasMany(Slider::class);
    }
}

Dari perubahan di atas, kita menambahkan method baru yang bernama sliders. Dimana method tersebut berfungsi memberitahukan ke sistem, bahwa kita akan membuat relasi Many ke Model Slider atau table sliders.

Langkah 2 - ONE TO MANY antara table users dengan table categories

Selanjutnya, kita akan membuat relasi ONE TO MANY lagi antara table users dengan table categories, artinya 1 user bisa memiliki banyak data category.

Silahkan buka file app/Models/User.php, kemudian ubah kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    /** @use HasFactory<\Database\Factories\UserFactory> */
    use HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var list<string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var list<string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * Get the attributes that should be cast.
     *
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }

    /**
     * sliders
     *
     * @return void
     */
    public function sliders()
    {
        return $this->hasMany(Slider::class);
    }

    /**
     * categories
     *
     * @return void
     */
    public function categories()
    {
        return $this->hasMany(Category::class);
    }
}

Dari perubahan kode di atas, kita menambahkan 1 method baru lagi dengan nama categories, dimana method tersebut akan memberitahukan ke sistem, bahwa kita akan membuat relasi many ke dalam Model Category atau table categories.

Langkah 3 - ONE TO MANY (Inverse / Belongs To) antara table users dengan table places

Kita lanjutkan untuk membuat relasi ONE TO MANY (Invers / Belongs To) antara table users dengan table places. Yang artinya 1 data user bisa memiliki banyak data place.

Dan karena kita jadikan Inverse / Belongs To, maka kita juga dapat memanggil data induk yaitu user dari data place, yang artinya bisa dua arah.

Silahkan buka file app/Models/User.php, kemudian ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    /** @use HasFactory<\Database\Factories\UserFactory> */
    use HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var list<string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var list<string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * Get the attributes that should be cast.
     *
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }

    /**
     * sliders
     *
     * @return void
     */
    public function sliders()
    {
        return $this->hasMany(Slider::class);
    }

    /**
     * categories
     *
     * @return void
     */
    public function categories()
    {
        return $this->hasMany(Category::class);
    }

    /**
     * places
     *
     * @return void
     */
    public function places()
    {
        return $this->hasMany(Place::class);
    }
}

Di atas, kita menambahkan 1 method baru dengan nama places, dimana method tersebut akan mereferensikan relasi many ke dalam Model Place atau table places.

Setelah itu, kita juga akan atur untuk Inverse / Belongs To atau relasi baliknya. Tujuannya agar kita juga bisa memanggil data user dari data place.

Silahkan buka file app/Models/Place.php, kemudian ubah kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Place extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'title', 'slug', 'user_id', 'category_id', 'description', 'phone', 'website', 'office_hours', 'address', 'longitude','latitude'
    ];

    /**
     * user
     *
     * @return void
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Di atas, kita menambahkan method user yang di fungsikan untuk mendeklarasikan bahwa model User atau table users ini dimiliki dan terhubung dengan Model Place atau table places.

Langkah 4 - ONE TO MANY (Inverse / Belongs To) antara table categories dengan table places

Sama seperti sebelumnya, kita akan buat lagi relasi 2 araha menggunakan ONE TO MANY (Inverse / Belongs To) antara table categories dengan table places. Artinya 1 data category bisa memiliki banyak data place.

Silahkan buka file app/Models/Category.php, kemudian ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'name', 'slug', 'image'
    ];

    /**
     * places
     *
     * @return void
     */
    public function places()
    {
        return $this->hasMany(Place::class);
    }
}

Di atas, kita menambahkan 1 method baru dengan nama places, dimana method tersebut memerikathukan ke sistem bahwa kita akan membuat relasi many ke dalam Model Place atau table places.

Setelah itu, kita lanjutkan untuk membuat relasi kebalikannya atau Inverse. Silahkan buka file app/Models/Place.php, kemudian ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Place extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'title', 'slug', 'user_id', 'category_id', 'description', 'phone', 'website', 'office_hours', 'address', 'longitude','latitude'
    ];

    /**
     * user
     *
     * @return void
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    /**
     * category
     *
     * @return void
     */
    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

Di atas, kita menambahkan method baru dengan nama category, dimana method tersebut akan memberitahukan ke sistem bahwa model Category atau table categories memiliki hubungan dengan Model Place atau table places.

Langkah 5 - ONE TO MANY antara table places dengan table place_images

Terakhir, kita akan membuat relasi many antara table places dengan table places_images. Yang artinya 1 place bisa memiliki banyak data place image.

Silahkan buka file app/Model/Place.php, kemudian ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Place extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'title', 'slug', 'user_id', 'category_id', 'description', 'phone', 'website', 'office_hours', 'address', 'longitude','latitude'
    ];

    /**
     * user
     *
     * @return void
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    /**
     * category
     *
     * @return void
     */
    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    /**
     * images
     *
     * @return void
     */
    public function images()
    {
        return $this->hasMany(PlaceImage::class);
    }
}

Di atas, kita menambahkan 1 method baru dengan nama images, dimana method tersebut kita gunakan untuk membuat relasi many ke dalam model PlaceImage atau table place_images.

Eloquent Accessor, Mutator dan Casting


Laravel memiliki fitur yang bernama Mutator, Accessor dan Casting, fitur-fitur ini digunakan untuk melakukan manipulasi data di dalam attribute database dengan sangat mudah. Contoh sederhanya misalnya kita ingin melakukan insert data dengan enkripsi ke dalam database dan melakukan deskripsi saat menampilkan dari database secara otomatis, maka kita bisa menggunakan fitur ini.

Mendefinisikan sebuah Accessor

Accessor digunakan untuk melakukan manipulasi nilai attribute saat diakses, untuk mendefinisikan sebuah accessor kurang lebih seperti berikut ini :

get{namaAttribute}Attribute

namaAttribute merupakan nama attribute yang akan di format dengan accessor, misalnya kita ingin membuat attribute name saat diakses menjadi huruf besar atau uppercase kita bisa mendefinisikan sebuah accessor di dalam Model kurang lebih seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get name to Uppercase
     *
     * @param  string  $value
     * @return string
     */
    public function getNameAttribute($value)
    {
        return strtoupper($value);
    }
}

Di atas, kita membuat sebuah function dengan nama getNameAttribute dan di dalamnya kita lakukan return dengan menjadikannya sebagai huruf besar menggunakan strtouper.

Jika kita asumsikan mempunya data user dengan attribute name Fika Ridaul Maulayya, dan jika kita coba panggil kurang lebih seperti berikut ini :

use App\Models\User;

$user = User::find(1);

$name = $user->name;

Jika di jalankan, maka akan menghasilkan seperti ini : FIKA RIDAUL MAULAYYA.

Mendefinisikan sebuah Mutator

Mutator digunakan untuk melakukan manipulasi nilai attribute saat di set, untuk mendefinisikan mutator kurang lebih seperti berikut ini :

set{namaAttribute}Attribute

namaAttribute merupakan nama attribute yang akan di set menggunakan mutator, misalnya kita ingin melakukan insert data dengan merubahnya menjadi huruf kecil atau lowercase, kita bisa mendefinisikan sebuah mutator di dalam Model seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Set the user's first name.
     *
     * @param  string  $value
     * @return void
     */
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = strtolower($value);
    }
}

Setiap kita melakukan insert data name ke dalam database, maka akan di format menjadi huruf kecil semuanya.

Mendefinisikan sebuah Casting

Attribute Casting hampir memiliki fungsi yang sama dengan accessor dan mutator, tapi kita tidak perlu melakukan definisi sebuah method di dalam Model. Disini kita hanya mendefinisikan sebuah properti dengan nama $cast dan bisa melakukan konversi dari sebuah attribute ke dalam tipe data umum, seperti :

Dalam kasus ini kita ambil contoh untuk melakukan konversi attribute email_verified_at yang memiliki tipe data timestap di database, kemudian kita ubah menjadi datetime . Kurang lebih seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

Setelah kita belajar tentang Laravel Mutator, Accessor dan Casting, sekarang kita akan lanjutkan untuk menerapkan Accessor di dalam project yang sedang kita kembangkan, disini kebetulan kita hanya butuh untuk Accessor saja.

Langkah 1 - Menambahkan Accessor di Model Category

Sekarang kita akan belajar menambahkan Accessor di dalam Model Category untuk memanipulasi attribute image, disini kita akan membuat agar saat kita memanggil attribute image akan mendapatkan hasil full-path dari attribute tersebut.

Silahkan buka file app/Models/Category.php kemudian ubah kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'name', 'slug', 'image'
    ];

    /**
     * places
     *
     * @return void
     */
    public function places()
    {
        return $this->hasMany(Place::class);
    }

    /**
     * getImageAttribute
     *
     * @param  mixed $image
     * @return void
     */
    public function getImageAttribute($image)
    {
        return url('storage/categories/' . $image);
    }
}

Di atas kita menambahkan 1 method baru, yaitu getImageAttribute, dimana di dalamnya kita akan melakukan return atau mengembalikan ke dalam folder storage/categories/. Jadi saat kita memanggil attribute image makan akan otomatis menghasilkan output seperti berikut ini :

domain.com/storage/categories/nama_file_image.png

Tapi, jika kita tidak menggunakan fitur Accessor, maka hasilnya akan seperti berikut ini :

nama_file_image.png

Langkah 2 - Menambahkan Accessor di Model PlaceImage

Sekarang kita lanjutkan untuk menambahkan Accessor di dalam model PlaceImage, yang tujuannya saat kita memanggil attribute image, maka akan mendapatkan hasil full-path.

Silahkan buka file app/Models/PlaceImage.php, kemudian ubah kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class PlaceImage extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
        'place_id', 'image'
    ];

    /**
     * getImageAttribute
     *
     * @param  mixed $image
     * @return void
     */
    public function getImageAttribute($image)
    {
        return url('storage/places/' . $image);
    }
}

Di atas, kita menambahkan method getImageAttribute, yang di dalamnya akan me-return nilai dari attribute image dengan menambahkan full-path direktori.

Langkah 3 - Menambahkan Accessor di Model Slider

Terakhir, kita akan menambahkan Accessor di dalam Model Slider. Silahkan buka file app/Models/Slider.php, kemudian ubah kode-nya menjadi seperti berikut ini :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Slider extends Model
{
    /**
     * fillable
     *
     * @var array
     */
    protected $fillable = [
       'user_id', 'image',
    ];

    /**
     * getImageAttribute
     *
     * @param  mixed $image
     * @return void
     */
    public function getImageAttribute($image)
    {
        return url('storage/sliders/' . $image);
    }
}

Sama seperti sebelumnya, kita menambahkan 1 method baru dengan nama getImageAttribute di dalam Model Slider.

Membuat Data User dengan Seeder


Laravel memiliki fitur yang bernama Database Seeding, fitur ini bisa kita manfaatkan untuk membuat dummy data ke dalam database. Dan disini kita akan manfaatkan fitur ini untuk membuat dummy data user, yang mana akan digunakan untuk melakukan proses authentication di dalam halaman admin.

Langkah 1 - Membuat Class Seeder User

Untuk membuat sebuah seeder kita bisa menggunakan perintah Artisan, yaitu make:seeder dan diikuti dengan nama seeder yang ingin dibuat. Sekarang, silahkan jalankan perintah berikut ini di dalam terminal/CMD :

php artisan make:seeder UserSeeder

Jika perintah diatas berhasil dijalankan, maka kita akan mendapatkan 1 file baru di dalam folder database/seeders/UserSeeder.php. Silahkan buka file tersebut dan ubah kode-nya menjadi seperti berikut ini :

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        DB::table('users')->insert([
            'name'      => 'Administrator',
            'email'     => 'admin@gmail.com',
            'password'  => Hash::make('password'),
        ]);
    }
}

Di atas, kita import Facades DB, ini digunakan untuk melakukan insert data user ke dalam database dengan Query Builder .

use Illuminate\Support\Facades\DB;

Selanjutnya, kita juga import Facades Hash, ini akan digunakan untuk melakukan hash password ke dalam database.

use Illuminate\Support\Facades\Hash;

Dan di dalam function run kita melakukan insert data user ke dalam table users menggunakan Query Builder dan jika teman-teman perhatikan untuk password kita tambahkan Facades Hash untuk melakukan hashing password ke dalam database.

Langkah 2 - Menjalankan Seeder

Sekarang, kita akan menjalankan UserSeeder agar data user di atas di masukkan ke dalam table users. Silahkan jalankan perintah di bawah ini di dalam terminal/CMD :

composer dump-autoload
php artisan db:seed --class=UserSeeder

Jika berhasil, maka kita bisa melihat ada data user baru di dalam table users. Kurang lebih seperti berikut ini :

Membuat Data User dengan Tinker


Selain Database Seeding, Laravel juga memiliki fitur yang bernama artisan Tinker, dimana kita juga bisa membuat dummy data menggunakan fitur tersebut.

Secara default Laravel sudah memiliki fitur Tinker ini di dalam core system-nya. Tapi jika sebelumnya kita pernah mengahapusnya dari aplikasi, maka untuk menginstallnya lagi kita bisa menggunakan perintah berikut ini :

composer require laravel/tinker

Langkah 1 - Menjalankan Artisan Tinker

Pertama kita akan belajar bagaimana cara menjalankan fitur Tinker di dalam Laravel. Silahkan buka terminal/CMD kemudian ketik perintah berkut ini :

php artisan tinker

Jika berhasil, kita akan mendapatkan hasil seperti berikut ini :

Di dalam shell yang sedang aktif tersebut, kita bisa menjalankan seluruh kode yang ada di dalam Laravel. seperti Controller, Model dan lain-lain.

Langkah 2 - Membuat Data User Baru Dengan Tinker

Dalam kasus kali ini, kita akan belajar menambahkan data user baru menggunakan artisan Tinker. Silahkan jalankan perintah berikut ini di dalam shell aktif dari Tinker.

\App\Models\User::create(['name' => 'Kurnia Andi Nugroho', 'email' => 'kurnia@gmail.com', 'password' => bcrypt('password')]);

Jika kode di atas berhasil dijalankan, maka kita akan membuat sebuah data user baru dengan kridensial seperti berikut ini :

App\Models\User {#6219
    name: "Kurnia Andi Nugroho",
    email: "kurnia@gmail.com",
    #password: "$2y$10$sPiIMUAaztB2mMhiH0T.CetyzsauXwL4eXKU0/5kn8TDj9mCUUNBq",
    updated_at: "2023-04-11 02:27:29",
    created_at: "2023-04-11 02:27:29",
    id: 2,
}
ATTRIBUTE VALUE
name Kurnia Andi Nugroho
email kurnia@gmail.com
password password

CATATAN : pastikan data yang dijalankan di Tinker berbeda dengan yang pernah kita buat sebelumnya di dalam Database Seeding.

Jika berhasil, maka kita akan lihat di dalam table users di database, maka kita akan mendapatkan data user baru lagi dan sekarang data user kita menjadi 2.

INFORMASI : untuk keluar dari Tinker, ketik exit dan ENTER.

Beranda Mundur Maju