Cara menyimpan data dengan relasi model terkait di laravel

whynwd

whynwd Rabu, 28 April 2021

Cara menyimpan data dengan relasi model terkait di laravel

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.

Cara menyimpan data dengan relasi model terkait di laravel

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.

Cara menyimpan data dengan relasi model terkait di laravel

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.

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel