Menggunakan Migration Dan Seeder Untuk Setup Database Di Laravel - CRUDPRO

Menggunakan Migration Dan Seeder Untuk Setup Database Di Laravel

Menggunakan Migration Dan Seeder Untuk Setup Database Di Laravel

membantu meminimalkan masalah ketidakkonsistenan basis data yang dapat ada dengan beberapa pengembang bekerja pada aplikasi yang sama: kontributor baru hanya perlu menjalankan beberapa perintah artisan untuk mengatur basis data pada instalasi baru

Dalam panduan ini, kami akan membuat migrasi dan seeder untuk mengisi database aplikasi demo Laravel dengan data contoh. Pada akhirnya, Anda akan dapat membinasakan dan membuat ulang tabel database Anda sebanyak yang Anda inginkan, hanya dengan menggunakan perintah artisan.

Persyaratan

Untuk mengikuti panduan ini, Anda memerlukan:

  • Untuk mengikuti panduan ini, Anda memerlukan:
  • Docker diinstall di server Anda, ikuti Langkah 1 dan Langkah 2 dari Cara Memasang dan Menggunakan Docker di Ubuntu 18.04.
  • Docker Compose terinstal di server Anda, ikuti Langkah 1 Langkah Memasang Docker Compose di Ubuntu 18.04.
Catatan: Dalam panduan ini, kami akan menggunakan lingkungan pengembangan terkontainer yang dikelola oleh Docker Compose untuk menjalankan aplikasi, tetapi Anda dapat memilih untuk menjalankan aplikasi di server LEMP. Untuk menyiapkan ini, Anda bisa mengikuti panduan kami di Langkah Menginstal dan Mengonfigurasi Laravel dengan LEMP di Ubuntu 18.04.

Langkah 1 — Mendapatkan Aplikasi Demo

Untuk memulai, kami akan mengambil demo aplikasi Laravel dari repositori GitHub-nya. Kami tertarik dengan cabang tutorial-02, yang menyertakan penyiapan Docker Compose untuk menjalankan aplikasi pada container. Dalam contoh ini, kami akan mengunduh aplikasi ke folder rumah kami, tapi Anda bisa menggunakan directory pilihan Anda:

cd ~
curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-2.0.1.zip -o travellist.zip

Karena kami mengunduh kode aplikasi sebagai file .zip, kami memerlukan perintah unzip untuk membukanya. Jika Anda belum melakukannya, perbarui indeks paket lokal mesin Anda:

sudo apt update

Lalu instal paket unzip:

sudo apt install unzip

Setelah itu, unzip konten aplikasi:

unzip travellist.zip

Kemudian ganti nama direktori yang sudah dibongkar menjadi travellist-demo untuk akses yang lebih mudah:

mv travellist-laravel-demo-tutorial-2.0.1 travellist-demo

Pada langkah berikutnya, kami akan membuat file konfigurasi .env untuk menyiapkan aplikasi.

Langkah 2 — Mengatur File .env Aplikasi

Di Laravel, file .env digunakan untuk mengatur konfigurasi yang tergantung pada lingkungan, seperti kredensial dan informasi apa pun yang mungkin berbeda di antara penerapan. File ini tidak disertakan dalam kontrol revisi.

Peringatan: File konfigurasi lingkungan berisi informasi sensitif tentang server Anda, termasuk kredensial database dan kunci keamanan. Karena alasan itu, Anda tidak boleh membagikan file ini secara publik.

Nilai-nilai yang terkandung dalam file .env akan lebih diutamakan daripada nilai-nilai yang diatur dalam file konfigurasi biasa yang terletak di direktori config. Setiap penginstalan di lingkungan baru memerlukan file lingkungan yang disesuaikan untuk menentukan hal-hal seperti pengaturan koneksi database, opsi debug, dan URL aplikasi, di antara item lainnya yang dapat bervariasi tergantung pada lingkungan mana aplikasi dijalankan.

Arahkan ke direktori travellist-demo:(

cd travellist-demo

Sekarang kita akan membuat file .env baru untuk menyesuaikan opsi konfigurasi untuk lingkungan pengembangan yang sedang kita siapkan. Laravel dilengkapi dengan file example.env yang dapat kita salin untuk membuatnya sendiri:

cp .env.example .env

Buka file ini menggunakan nano atau teks editor pilihan Anda:

nano .env

Seperti inilah tampilan file .env Anda sekarang:

APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000 

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
…

File .env saat ini dari aplikasi demo travellist berisi pengaturan untuk menggunakan lingkungan terkontainerisasi yang telah kami buat dengan Docker Compose di bagian terakhir seri ini. Anda tidak perlu mengubah nilai-nilai ini, tetapi Anda bebas untuk memodifikasi DB_DATABASE, DB_USERNAME, dan DB_PASSWORD jika Anda mau, karena ini ditarik oleh file docker-compose.yml kami secara otomatis untuk menyiapkan database pengembangan. Pastikan saja variabel DB_HOST tetap tidak berubah, karena ini mereferensikan nama layanan database kami dalam lingkungan Docker Compose.

Jika Anda melakukan perubahan pada file, pastikan untuk menyimpan dan menutupnya dengan menekan CTRL + X, Y, lalu ENTER.

Catatan: Jika Anda telah memilih untuk menjalankan aplikasi di server LEMP, Anda perlu mengubah nilai yang disorot untuk mencerminkan pengaturan database Anda sendiri, termasuk variabel DB_HOST.

Langkah 3 — Menginstal Ketergantungan Aplikasi dengan Komposer

Kami sekarang akan menggunakan Composer, alat manajemen dependensi PHP, untuk menginstal dependensi aplikasi dan memastikan kami dapat menjalankan perintah artisan.

Buka lingkungan Docker Compose Anda dengan perintah berikut. Ini akan membuat image travellist untuk layanan aplikasi dan menarik image Docker tambahan yang diperlukan oleh layanan nginx dan db, untuk membuat lingkungan aplikasi:

docker-compose up -d
Output
Creating network "travellist-demo_travellist" with driver "bridge"
Building app
Step 1/11 : FROM php:7.4-fpm
 ---> fa37bd6db22a
Step 2/11 : ARG user
 ---> Running in 9259bb2ac034
…
Creating travellist-app   ... done
Creating travellist-nginx ... done
Creating travellist-db    ... done

Operasi ini mungkin membutuhkan waktu beberapa menit untuk selesai. Setelah proses selesai, kita bisa menjalankan Composer untuk menginstall dependensi aplikasi.

Untuk menjalankan komposer dan perintah lain di wadah layanan aplikasi, kami akan menggunakan docker-compose exec. Perintah exec memungkinkan kita untuk mengeksekusi perintah apapun pilihan kita pada container yang dikelola oleh Docker Compose. Ini menggunakan sintaks berikut: docker-compose exec service_name perintah.

Catatan: Jika Anda memilih untuk menggunakan server LEMP untuk menjalankan aplikasi demo, Anda harus mengabaikan bagian aplikasi docker-compose exec dari perintah yang tercantum dalam panduan ini. Misalnya, daripada menjalankan perintah berikut seperti yang tertulis, Anda hanya akan menjalankan:
composer install

Untuk menjalankan penginstalan komposer di wadah aplikasi, jalankan:

docker-compose exec app composer install
Output
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 85 installs, 0 updates, 0 removals
  - Installing doctrine/inflector (1.3.1): Downloading (100%)         
  - Installing doctrine/lexer (1.2.0): Downloading (100%)         
  - Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%)     
…

Saat Composer selesai menginstal dependensi aplikasi, Anda akan dapat menjalankan perintah artisan. Untuk menguji apakah aplikasi dapat terhubung ke database, jalankan perintah berikut yang akan membersihkan tabel yang sudah ada sebelumnya:

docker-compose exec app php artisan db:wipe

Perintah ini akan membuang semua tabel yang sudah ada sebelumnya pada database yang dikonfigurasi. Jika berhasil dijalankan dan aplikasi dapat terhubung ke database, Anda akan melihat keluaran seperti ini:

Output
Dropped all tables successfully.

Sekarang setelah Anda menginstal dependensi aplikasi dengan Composer, Anda dapat menggunakan alat artisan untuk membuat migrasi dan seeder.

Langkah 4 — Membuat Migrasi Database

Alat baris perintah artisan yang dikirimkan bersama Laravel berisi serangkaian perintah pembantu yang dapat digunakan untuk mengelola aplikasi dan bootstrap kelas baru. Untuk menghasilkan kelas migrasi baru, kita dapat menggunakan perintah make:migration sebagai berikut:

docker-compose exec app php artisan make:migration create_places_table

Laravel menyimpulkan operasi yang akan dieksekusi (buat), nama tabel (tempat), dan apakah migrasi ini akan membuat tabel baru atau tidak, berdasarkan nama deskriptif yang diberikan pada perintah make:migration.

Anda akan melihat output yang serupa dengan ini:

Output
Created Migration: 2020_02_03_143622_create_places_table

Ini akan menghasilkan file baru di direktori database/migrasi aplikasi. Stempel waktu yang disertakan dalam file yang dibuat secara otomatis digunakan oleh Laravel untuk menentukan di urutan mana migrasi harus dijalankan.

Gunakan editor teks pilihan Anda untuk membuka file migrasi yang dihasilkan. Ingatlah untuk mengganti nilai yang disorot dengan nama file migrasi Anda sendiri:

nano database/migrations/2020_02_03_143622_create_places_table.php

File migrasi yang dihasilkan berisi kelas bernama CreatePlacesTable:

<?php

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

class CreatePlacesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('places', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('places');

Kelas ini memiliki dua metode: naik dan turun. Kedua metode tersebut berisi kode bootstrap yang dapat Anda kembangkan untuk menyesuaikan apa yang terjadi saat migrasi tersebut dijalankan dan juga apa yang terjadi saat migrasi tersebut dibatalkan.

Kita akan memodifikasi metode up sehingga tabel tempat mencerminkan struktur yang telah kita gunakan dalam versi aplikasi saat ini:

  • id: bidang kunci utama.
  • nama : nama tempat.
  • dikunjungi: apakah tempat ini sudah pernah dikunjungi atau belum.

Pembuat skema Laravel memperlihatkan metode untuk membuat, memperbarui, dan menghapus tabel dalam database. Kelas Blueprint mendefinisikan struktur tabel dan menyediakan beberapa metode untuk mengabstraksi definisi setiap bidang tabel.

Kode yang dibuat secara otomatis menyiapkan kolom id utama yang disebut id. Metode timestamps membuat dua bidang datetime yang secara otomatis diperbarui oleh kelas basis data yang mendasarinya saat data dimasukkan atau diperbarui dalam tabel tersebut. Selain itu, kita perlu menyertakan nama dan bidang yang dikunjungi.

Bidang nama kami akan bertipe string, dan bidang yang kami kunjungi akan disetel dengan tipe boolean. Kami juga akan menyetel nilai default 0 untuk bidang yang dikunjungi, sehingga jika tidak ada nilai yang diteruskan, artinya tempat tersebut belum dikunjungi. Ini adalah bagaimana metode up akan terlihat seperti sekarang:

…
    public function up()
    {
        Schema::create('places', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name', 100);
            $table->boolean('visited')->default(0);
            $table->timestamps();
        });
    }
…
Catatan: Anda dapat menemukan daftar lengkap jenis kolom yang tersedia di dokumentasi Laravel.

Setelah menyertakan dua baris yang disorot pada skrip migrasi Anda sendiri, simpan dan tutup file tersebut.

Migrasi Anda sekarang siap dijalankan melalui artisan migrate. Akan tetapi, itu hanya akan membuat tabel kosong; kami juga harus dapat memasukkan data sampel untuk pengembangan dan pengujian. Pada langkah berikutnya, kita akan melihat cara melakukannya menggunakan seeder database.

Langkah 5 — Membuat Database Seeder

Seeder adalah kelas khusus yang digunakan untuk membuat dan memasukkan data sampel (seed) ke dalam database. Ini adalah fitur penting dalam lingkungan pengembangan, karena ini memungkinkan Anda untuk membuat ulang aplikasi dengan database baru, menggunakan nilai sampel yang seharusnya Anda masukkan secara manual setiap kali database dibuat ulang.

Sekarang kita akan menggunakan perintah artisan untuk membuat kelas seeder baru untuk tabel tempat kita yang disebut PlacesTableSeeder:

docker-compose exec app php artisan make:seeder PlacesTableSeeder

Perintah tersebut akan membuat file baru bernama PlacesTableSeeder.php di dalam direktori database/seeds. Buka file tersebut dengan menggunakan editor teks pilihan Anda:

nano database/seeds/PlacesTableSeeder.php

Seperti inilah tampilan file PlacesTableSeeder.php yang dibuat secara otomatis:

<?php

use Illuminate\Database\Seeder;

class PlacesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

Kelas seeder baru kami berisi metode kosong bernama run. Metode ini akan dipanggil saat perintah db:seed Artisan dijalankan.

Kita perlu mengedit metode run untuk memasukkan instruksi untuk memasukkan data sampel ke dalam database. Kami akan menggunakan pembuat kueri Laravel untuk menyederhanakan proses ini.

Pembuat kueri Laravel menawarkan antarmuka yang lancar untuk operasi database seperti menyisipkan, memperbarui, menghapus, dan mengambil data. Itu juga memperkenalkan perlindungan terhadap serangan injeksi SQL. Pembuat kueri diekspos oleh fasad DB - proksi statis ke kelas basis data yang mendasarinya dalam wadah layanan.

Untuk memulai, kami akan membuat variabel kelas statis untuk menampung semua tempat sampel yang ingin kami masukkan ke dalam database sebagai larik. Ini akan memungkinkan kita untuk menggunakan loop foreach untuk mengulangi semua nilai, memasukkan masing-masing ke dalam database menggunakan pembuat kueri.

Kita akan menyebut variabel ini $places:

<?php

use Illuminate\Database\Seeder;

class PlacesTableSeeder extends Seeder
{
    static $places = [
        'Berlin',
        'Budapest',
        'Cincinnati',
        'Denver',
        'Helsinki',
        'Lisbon',
        'Moscow',
        'Nairobi',
        'Oslo',
        'Rio',
        'Tokyo'
    ];
…

Selanjutnya, kita perlu menyertakan pernyataan penggunaan di bagian atas kelas PlacesTableSeeder untuk memfasilitasi referensi fasad DB di seluruh kode:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class PlacesTableSeeder extends Seeder
…

Kita sekarang dapat mengulang melalui nilai array $places menggunakan loop foreach, dan menyisipkan masing-masing di tabel tempat kita menggunakan pembuat kueri

…
    public function run()
    {
        foreach (self::$places as $place) {
            DB::table('places')->insert([
                'name' => $place,
                'visited' => rand(0,1) == 1
            ]);
        }
    }

Perulangan foreach beriterasi melalui setiap nilai dari array statis $places. Pada setiap iterasi, kami menggunakan fasad DB untuk memasukkan baris baru pada tabel tempat. Kami menetapkan bidang nama ke nama tempat yang baru saja kami peroleh dari larik $places, dan kami menetapkan bidang yang dikunjungi ke nilai acak 0 atau 1.

Seperti inilah tampilan kelas PlacesTableSeeder lengkap setelah semua pembaruan:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class PlacesTableSeeder extends Seeder
{
    static $places = [
        'Berlin',
        'Budapest',
        'Cincinnati',
        'Denver',
        'Helsinki',
        'Lisbon',
        'Moscow',
        'Nairobi',
        'Oslo',
        'Rio',
        'Tokyo'
    ];

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        foreach (self::$places as $place) {
            DB::table('places')->insert([
                'name' => $place,
                'visited' => rand(0,1) == 1
            ]);
        }
    }
}

Simpan dan tutup file setelah Anda selesai melakukan perubahan ini.

Kelas seeder tidak dimuat secara otomatis dalam aplikasi. Kita perlu mengedit kelas DatabaseSeeder utama untuk menyertakan panggilan ke seeder yang baru saja kita buat.

Buka file database/seeds/DatabaseSeeder.php dengan nano atau editor favorit Anda:

nano database/seeds/DatabaseSeeder.php

Kelas DatabaseSeeder terlihat seperti seeder lainnya: ia diperluas dari kelas Seeder dan memiliki metode run. Kami akan memperbarui metode ini untuk menyertakan panggilan ke PlacesTableSeeder.

Perbarui metode run saat ini di dalam kelas DatabaseSeeder Anda dengan menghapus baris yang dikomentari dan menggantinya dengan kode yang disorot berikut:

…
    public function run()
    {
        $this->call(PlacesTableSeeder::class);
    }
...

Beginilah tampilan kelas DatabaseSeeder lengkap setelah pembaruan:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(PlacesTableSeeder::class);
    }
}

Simpan dan tutup file setelah Anda selesai memperbarui kontennya.

Kami sekarang telah selesai menyiapkan migrasi dan seeder untuk tabel tempat kami. Pada langkah selanjutnya, kita akan melihat cara menjalankannya.

Langkah 6 — Menjalankan Migrasi Database dan Seeder

Sebelum melanjutkan, kami perlu memastikan bahwa aplikasi Anda sudah aktif dan berjalan. Kami akan menyiapkan kunci enkripsi aplikasi, lalu mengakses aplikasi dari browser untuk menguji server web.

Untuk menghasilkan kunci enkripsi yang dibutuhkan oleh Laravel, Anda dapat menggunakan perintah artisan key:generate :(Diedit)Pulihkan teks asli

docker-compose exec app php artisan key:generate

Setelah kunci dibuat, Anda akan dapat mengakses aplikasi dengan mengarahkan browser ke nama host server atau alamat IP Anda di port 8000:

http://server_host_or_ip:8000

Anda akan melihat halaman seperti berikut:

Menggunakan MIgration Dan Seeder Untuk Setup Database Di Laravel

Itu berarti aplikasi dapat terhubung ke database, tetapi tidak dapat menemukan tabel yang disebut tempat. Kami akan membuat tabel tempat sekarang, menggunakan perintah migrate artisan berikut:

docker-compose exec app php artisan migrate

Anda akan mendapatkan output yang mirip dengan ini:

Output
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
Migrating: 2020_02_10_144134_create_places_table
Migrated:  2020_02_10_144134_create_places_table (0.03 seconds)

Anda akan melihat bahwa beberapa migrasi lainnya dijalankan bersama dengan migrasi create_places_table yang telah kami siapkan. Migrasi ini dihasilkan secara otomatis saat Laravel diinstal. Meskipun kami tidak akan menggunakan tabel tambahan ini sekarang, tabel tersebut akan diperlukan di masa mendatang saat kami memperluas aplikasi untuk mendaftarkan pengguna dan menjadwalkan pekerjaan. Untuk saat ini, Anda dapat membiarkannya apa adanya.

Saat ini meja kami masih kosong. Kita perlu menjalankan perintah db:seed untuk mengunggulkan basis data dengan tempat sampel kita:

docker-compose exec app php artisan db:seed

Ini akan menjalankan seeder kami dan memasukkan nilai sampel yang kami tentukan di dalam kelas PlacesTableSeeder kami. Anda akan melihat output yang serupa dengan ini:

Output
Seeding: PlacesTableSeeder
Seeded:  PlacesTableSeeder (0.06 seconds)
Database seeding completed successfully.

Sekarang, muat ulang halaman aplikasi di browser Anda. Anda akan melihat halaman yang mirip dengan ini:

Menggunakan MIgration Dan Seeder Untuk Setup Database Di Laravel

Setiap kali Anda perlu memulai dari awal, Anda dapat menghapus semua tabel database Anda dengan:

docker-compose exec app php artisan db:wipe
Output
Dropped all tables successfully.

Untuk menjalankan migrasi aplikasi dan memasukkan tabel dalam satu perintah, Anda dapat menggunakan:

docker-compose exec app php artisan migrate --seed
Output
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.07 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
Migrating: 2020_02_10_144134_create_places_table
Migrated:  2020_02_10_144134_create_places_table (0.03 seconds)
Seeding: PlacesTableSeeder
Seeded:  PlacesTableSeeder (0.06 seconds)
Database seeding completed successfully.

Jika ingin membatalkan migrasi, Anda dapat menjalankan:

docker-compose exec app php artisan migrate:rollback

Ini akan memicu metode down untuk setiap kelas migrasi di dalam folder migrations. Biasanya, itu akan menghapus semua tabel yang dibuat melalui kelas migrasi, meninggalkan tabel lain yang mungkin telah dibuat secara manual. Anda akan melihat keluaran seperti ini:

Output
Rolling back: 2020_02_10_144134_create_places_table
Rolled back:  2020_02_10_144134_create_places_table (0.02 seconds)
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table (0.02 seconds)

Perintah rollback sangat berguna saat Anda membuat perubahan pada model aplikasi dan perintah db:wipe tidak dapat digunakan - misalnya, jika beberapa sistem bergantung pada database yang sama.

Kesimpulan

Dalam panduan ini, kita telah melihat cara menggunakan migrasi database dan seeder untuk memfasilitasi penyiapan database pengembangan dan pengujian untuk aplikasi Laravel 6.

Sebagai langkah selanjutnya, Anda mungkin ingin memeriksa dokumentasi Laravel untuk detail lebih lanjut tentang cara menggunakan pembuat kueri, dan cara menggunakan model Eloquent untuk abstrak skema database aplikasi Anda lebih jauh.