Ketika memiliki tabel atau model yang berelasi, tentu kita akan menggunakan metode tentang bagaimana mengambil dan memasukan data ke model terkait secara otomatis.
Kita ambil contoh seperti postingan blog atau komentar blog, yang tentu akan memiliki lebih dari satu model dan saling berhubungan; antara pengguna yang membuat postingan, pengguna yang berkomentar, dan komentar-komentar untuk setiap postingan.
Setiap model akan saling berhubungan, dan dibutuhan keys / kunci identifikasi untuk dapat terhubung dan yang akan memiliki peran dan keterkaitan.
Lebih jelasnya mari kita buat contoh. Silahkan ikuti langkah-langkah pembuatannya. Kita akan membuatnya mulai dari atuentikasi, lalu membuat relasi tabel / model, insert data baru dan kueri.
Instalasi Laravel
Kita mulai dari melakukan instalasi laravel. Silahkan jalankan perintah di bawah ini.
laravel new example-app #atau composer create-project laravel/laravel example-app
Database, Migrasi, dan Model
Selanjutnya silahkan buat database MySQL baru dan hubungkan dengan aplikasi.
//.env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=db_example_app DB_USERNAME=root DB_PASSWORD=
Kemudian kita lanjutnya membuat file migrasi baru dan Model. Kita tambahkan sebuah tabel untuk dibuat relasi dengan tabel users.
php artisan make:model Post -m
Kemudian buka file migrasi yang baru di buat dan tambahkan kolom seperti di bawah ini.
public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->foreignId('user_id'); $table->string('title'); $table->text('body'); $table->timestamps(); }); }
Kita tambahkan foreign key user_id
agar memiliki hubungan dengan tabel users.
Terakhir jalankan perintah migrasi.
php artisan migrate
MariaDB [db_example_app]> show tables; +---------------------------------+ | Tables_in_db_example_app | +---------------------------------+ | failed_jobs | | migrations | | password_resets | | posts | | users | +---------------------------------+ 5 rows in set (0.001 sec)
Autentikasi
Kita lanjutkan untuk membuat autentikasi user; baik route, controller dan halaman untuk proses registrasi dan login.
Untuk membuatnya kita akan gunakan scaffold laravel breeze agar lebih cepat dan mudah. Silahkan jalankan perintah dibawah ini.
composer require laravel/breeze --dev php artisan breeze:install npm install npm run dev php artisan serve
Setelah selesai silahkan buka http://localhost:8000/ pada browser dan lakukan registrasi dan login.
Membuat Form Input
Setelah login dan masuk ke dashboard user, kita lanjutkan membuat halaman baru untuk pembuatan post baru.
Silahkan buat folder baru di direktori views dengan nama post dan tambahkan file create.blade.php di dalamnya. Kemudian silahkan copas html di bawah ini.
//views/post/create.blade.php <x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Buat Post Baru') }} </h2> </x-slot> <div class="py-12"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div class="p-6 bg-white border-b border-gray-200"> <!-- Validation Errors --> <x-auth-validation-errors class="mb-4" :errors="$errors" /> <!-- Session Status Success --> <x-auth-session-status class="mb-4" :status="session('success')" /> <form method="POST" action="{{ route('store') }}"> @csrf <div> <x-label for="title" :value="__('Title')" /> <x-input id="title" class="block mt-1 w-full" type="text" name="title" :value="old('title')" required autofocus /> </div> <div class="mt-4"> <x-label for="body" :value="__('Body')" /> <x-input id="body" class="block mt-1 w-full" type="text" name="body" :value="old('body')" required /> </div> <div class="flex items-center justify-end mt-4"> <x-button class="ml-4"> {{ __('Submit') }} </x-button> </div> </form> </div> </div> </div> </div> </x-app-layout>
Selanjutnya kita buat controller baru.
php artisan make:controller PostController
Buka PostController.php dan buat seperti di bawah ini.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Post; use Auth; class PostController extends Controller { public function create() { return view('post.create'); } public function store(Request $request) { $request->validate([ 'title' => 'required', 'body' => 'required', ]); $post = new Post; $post->title = $request->title; $post->body = $request->body; $post->user_id = Auth::user()->id; $post->save(); // return response()->json($post, 200); return back()->with('success',' Post baru berhasil dibuat.'); } }
Kita bahas controller di atas. Pertama ada create()
method, permintaan untuk menampilkan halaman create di folder post. Kemudian ada store()
method untuk permintaan insert data record baru.
Kita memiliki relasi antara tabel posts dan users. Kita buat ini untuk setiap post yang dibuat memiliki informasi tentang yang membuat post tersebut. Untuk membuat post baru, pengguna diminta untuk login terlebih dahulu dan dengan metode Auth
kita dapat mengakases dan mendapatkan informasi pengguna sebagai value untuk permintaan user_id.
Selanjutnya silahkan buka file route web.php dan tambahkan route dibawah ini.
Route::middleware(['auth'])->group(function () { Route::post('/post/store', [PostController::class, 'store'])->name('store');; Route::get('/post/create', [PostController::class, 'create'])->name('create');;; });
Sekarang tinggal mencobanya. Silahkan login dan coba membuat post baru.
Lihat juga data yang telah dibuat pada database.
MariaDB [db_example_app]> select * from posts; +----+---------+---------+--------+---------------------+---------------------+ | id | user_id | title | body | created_at | updated_at | +----+---------+---------+--------+---------------------+---------------------+ | 1 | 1 | title 1 | body 1 | 2021-04-27 06:17:16 | 2021-04-27 06:17:16 | | 2 | 1 | title 2 | body 2 | 2021-04-27 06:17:24 | 2021-04-27 06:17:24 | +----+---------+---------+--------+---------------------+---------------------+ 2 rows in set (0.053 sec)
Relasi Eloquent Model
Sekarang kita coba tampilkan semua data post yang dimiliki user sesuai key / ID dengan membuat relasi model dan melakukan kueri.
Pertama kita hubungan model User dengan Post. Silahkan buka User.php dan tambah dibawah ini.
public function posts() { return $this->hasMany(Post::class); }
Kemudian di web.php silahkan ubah route dashboad menjadi seperti di bawah ini.
Route::get('/dashboard', function () { $users = User::with('posts')->get(); foreach ($users as $user) { return View::make('dashboard', ['user' => $user->posts]); } })->middleware(['auth'])->name('dashboard');
Buka dashboard.blade.php dan buat foreach seperti dibawah ini.
@foreach ($user as $post) <div class="p-6 bg-white border-b border-gray-200"> {{$post->title}} {{$post->body}} </div> @endforeach
Selesai. Silahkan buka halaman dashboard untuk melihat hasilnya.
Demikian cara dan contoh menyimpan data dengan relasi di laravel. Silahkan dicoba, dikembangkan, dan lakukan eksperimen.
Untuk pembahasan lebih lanjut mengenai relasi dan contoh lainnya dapat dilihat pada artikel Belajar relasi eloquent laravel - MySQL Database.