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

 Kurang lebih tampilannya akan seperti ini

Setelah itu kita tambahkan route baru untuk menyimpan data comments pada routes/web.php

Route::post('/comments',    [CommentsController::class'store'])->name('comments.store');

 

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]);

    }

}

 

 Kita coba save dan refresh kembali pada browser, lalu kita coba masukan komentar kita



Sekian Artikel mengenai Laravel, mohon maaf apabila banyak sekali kekurangan


Terima kasih

 

 

Next Post Previous Post
No Comment
Add Comment
comment url