Laravel - Relationships
Relationships
Dalam memanfaatkan database, dikenal ada relasi antar entity
atau antar tabel. Penggunaan fitur ini pada database konvesional membutuhkan
penggunaan perintah SQL yang relatif panjang dan juga membutuhkan penanganan
dari program yang membutuhkan program yang rumit pula. Artikel ini membahas
mengenai Relationship pada Eloquent yang memudahkan penggunaan database yang
memiliki relationship.
Berikut adalah beberapa jenis relasi database yang dikenal
pada umumnya dan telah diakomodasi oleh Laravel.
1.
Relasi one to one dimana sebuah data pada sebuah
tabel hanya memiliki relasi ke sebuah data pada tabel yang lain. Misalnya,
sebuah data tabel posts memiliki relasi 1 user_id di tabel users.
2.
Relasi one to many dimana sebuah data pada
sebuah tabel memiliki relasi ke beberapa data pada tabel yang lain. Misalnya,
sebuah data tabel posts memiliki relasi banyak data comment di comments. Atau
dengan kata lain, 1 posts memiliki banyak data comment.
3.
Relasi many to one (One to many Inverse) dimana
merupakan kebalikan dari relasi one to many. Misalnya kita ingin mengetahui
data comment di comments memiliki post apa, maka relasi ini yang akan
digunakan.
4.
Relasi many to many dimana banyak data pada
sebuah tabel memiliki relasi ke banyak data juga pada tabel yang lainnya.
Relasi tersebut terbentuk melalui sebuah tabel bantu.
Untuk kali ini kita akan coba membuat relasi antara posts
dengan comments
php artisan make:model Comments --migration
Setelah itu akan terbuat 2 file baru
-
app\Models\Comments.php
-
database\migrations\2021_06_03_051907_create_comments_table.php
Pada file “database\migrations\2021_06_03_051907_create_comments_table.php”
kita bisa tambahkan field yang kita inginkan , untuk contohnya seperti gambar
dibawah ini
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCommentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->bigIncrements('id');
$table->text('content', 65535);
$table->integer('blog_post_id')->index('post_id_foreign');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('comments');
}
}
Setelah itu kita akan coba jalankan sintak di bawah pada
terminal
php artisan migrate
Lalu kita coba rubah file models dari BlogPost dan Comments
Comments.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Comments extends Model
{
protected $table = 'comments';
protected $fillable = ['content', 'blog_post_id'];
use HasFactory;
public function post()
{
return $this->belongsTo(BlogPost::class);
}
}
BlogPost.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class BlogPost extends Model
{
protected $fillable = ['title', 'content'];
use HasFactory;
public function comments()
{
return $this->hasMany(Comments::class);
}
}
Buka file resources\views\posts\show.blade.php kita
tambahkan form untuk komentar dan list tempat yang nantinya diisi oleh list
komentar
@extends('layouts.app')
@section('title', 'Posts')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-12">
<p>
<h2> {{ $post['title'] }}</h2>
{{ $post['content'] }}
@if ($post['is_new'])
<b>(new)</b>
@endif
</p>
</div>
<div class="col-md-12">
<hr>
<h5> Comments </h5>
@forelse ($post->comments as $key => $comment)
<div class="row">
<div class="col-md-8">
<p> {{ $comment->content }}
<br><small> {{ $comment->created_at }}</small>
</p>
</div>
</div>
@empty
No Comments Found !
@endforelse
</div>
</div>
<div class="row">
<div class="col-md-12">
<hr>
<form action="{{ route('comments.store') }}" method="POST">
@csrf
<div class="form-group">
<label for="content"> Comments </label>
<textarea id="content" name="content" class="form-control" >{{ old('content') }}</textarea>
</div>
<input type="hidden" value="{{ $post['id'] }}" name="blog_post_id">
@error('content')
<div class="alert alert-danger"> {{ $message }}</div>
@enderror
<div>
<input type="submit" value="Submit">
</div>
</form>
</div>
</div>
</div>
@endsection
Setelah itu kita tambahkan route baru untuk menyimpan data comments pada routes/web.php
Setelah itu kita coba buat controller baru untuk menyimpan
data comments
php artisan make:controller CommentsController
Lalu jangan lupa buat request untuk memvalidasi Datanya
php artisan make:request CommentRequest
lalu tambahkan rules untuk CommentRequest
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CommentRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'content' => 'required|min:10',
'blog_post_id' => 'required|exists:blog_posts,id'
];
}
}
Lalu pada CommentsController yang telah dibuat kita buat
fungsi store yang berisi seperti di bawah ini
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\CommentRequest as CommentRequest;
use App\Models\Comments;
class CommentsController extends Controller
{
public function store(CommentRequest $request)
{
$validated = $request->validated();
Comments::create($validated);
$request->session()->flash('status', 'Comment Telah Berhasil ditambahkan !');
return redirect()->route('posts.show', ['post'=> $request->blog_post_id]);
}
}
Sekian Artikel mengenai Laravel, mohon maaf apabila banyak sekali kekurangan