Pada tutorial laravel sebelumnya kita sudah membuat CRUD Tag, Tutorial kali ini kita akan membahas relasa tag dan post.
Tutorial Sebelumnya - Boilerplate Laravel 7 : Membuat CRUD Tag
Maksud relasi di sini adalah adanya hubungan antara tabel post dan tag, pada saat input post dalam form terdapat pilihan untuk memilih tag, seperti di blogger saat membuat postingan/artikel ada fitur label.
Langsung saja kita coba, pada tutorial sebelumnya kita sudah membuat model dan dbnya jadi kita tinggal edit file PostsController.php dan file viewnya.
PostsController.php
<?php
namespace App\Http\Controllers;
use Session;
use App\Post;
use App\Category;
use App\Tag;
use Illuminate\Http\Request;
class PostsController extends Controller
{
public function index()
{
return view('admin.posts.index')->with('posts', Post::all());
}
public function create()
{
$categories = Category::all();
$tags = Tag::all();
if($categories->count() == 0){
Session::flash('info', 'category nothing');
return redirect()->back();
}
return view('admin.posts.create')->with('categories', $categories)->with('tags', $tags);
}
public function store(Request $request)
{
$this->validate($request, [
"title" => "required",
"featured" => "required|image",
"content" => "required",
"id_category" => "required",
"tags" => "required"
]);
$featured = $request->featured;
$featured_new_name = time().str_replace(' ','-',$featured->getClientOriginalName());
$featured->move('uploads', $featured_new_name);
$post = Post::create([
"title" => $request->title,
"content" => $request->content,
"featured" => "uploads/" . $featured_new_name,
"id_category" => $request->id_category,
"slug" => str_slug($request->title)
]);
$post->tags()->attach($request->tags);
Session::flash('success', 'save success');
return redirect()->route('posts');
}
public function show($id)
{
}
public function edit($id)
{
$post = Post::find($id);
$categories = Category::all();
$tags = Tag::all();
return view('admin.posts.edit')->with('post', $post)->with('categories', $categories)->with('tags', $tags);
}
public function update(Request $request, $id)
{
$this->validate($request, [
"title" => "required",
"content" => "required",
"id_category" => "required"
]);
$post = Post::find($id);
if($request->hasFile('featured')){
\File::delete($post->featured);
$featured = $request->featured;
$featured_new_name = time().str_replace(' ','-',$featured->getClientOriginalName());
$featured->move('uploads', $featured_new_name);
$post->featured = "uploads/".$featured_new_name ;
}
$post->title = $request->title;
$post->content = $request->content;
$post->id_category = $request->id_category;
$post->slug = str_slug($request->title);
$post->save();
$post->tags()->sync($request->tags);
Session::flash('success', 'update success');
return redirect()->route('posts');
}
public function delete($id)
{
$post = Post::find($id);
//File::delete($post->featured);
$post->delete();
Session::flash('success', 'delete success');
return redirect()->route('posts');
}
public function destroy($id)
{
$post = Post::withTrashed()->where('id', $id)->first();
\File::delete($post->featured);
$post->forceDelete();
Session::flash('success', 'destroy success');
return redirect()->back();
}
public function trashed()
{
$posts = Post::onlyTrashed()->get();
return view('admin.posts.trashed')->with('posts', $posts);
}
public function restore($id)
{
$post = Post::withTrashed()->where('id', $id)->first();
$post->restore();
Session::flash('success', 'restore success');
return redirect()->route('posts');
}
}
Setelah di ubah selanjutnya silahkan buka dan ubah file create.blade.php dan edit.blade.php di dalam folder resources/views/admin/posts, lihat script dibawah
create.blade.php
@extends('layouts.app')
@section('content')
@include('admin.includes.errors ')
<div class="panel panel-default">
<div class="panel-heading">
Creat a new post
</div>
<div class="panel-body">
<form action="{{ route('post.store') }}" method="post" enctype="multipart/form-data">
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" name="title">
</div>
<div class="form-group">
<label for="featured">Featured Image</label>
<input type="file" class="form-control" name="featured">
</div>
<div class="form-group">
<label for="category">Category</label>
<select name="id_category" id="" class="form-control">
@foreach($categories as $category)
<option value="{{ $category->id }}">{{ $category->name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="tags">Select Tags</label>
@foreach($tags as $tag)
<div class="checkbox">
<label for="tag">
<input type="checkbox" name='tags[]' value='{{ $tag->id }}'>{{ $tag->tag }}
</label>
</div>
@endforeach
</div>
<div class="form-group">
<label for="content">Content</label>
<textarea class="form-control" name="content" id="" cols="5" rows="5"></textarea>
</div>
<div class="form-group">
<div class="text-center">
<button class="btn btn-success" type="submit">Save</button>
</div>
</div>
</form>
</div>
</div>
@stop
edit.blade.php
@extends('layouts.app')
@section('content')
@include('admin.includes.errors ')
<div class="panel panel-default">
<div class="panel-heading">
Edit post
</div>
<div class="panel-body">
<form action="{{ route('post.update', ['id' => $post->id]) }}" method="post" enctype="multipart/form-data">
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" name="title" value="{{ $post->title }}">
</div>
<div class="form-group">
<label for="featured">Featured Image</label>
<input type="file" class="form-control" name="featured">
</div>
<div class="form-group">
<label for="category">Category</label>
<select name="id_category" id="" class="form-control">
@foreach($categories as $category)
<option value="{{ $category->id }}" @if($post->id_category == $category->id) selected @endif>{{ $category->name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="tags">Select Tags</label>
@foreach($tags as $tag)
<div class="checkbox">
<label for="tag">
<input type="checkbox" name='tags[]' value='{{ $tag->id }}'
@foreach($post->tags as $t)
@if($tag->id == $t->id)
checked
@endif
@endforeach
>{{ $tag->tag }}
</label>
</div>
@endforeach
</div>
<div class="form-group">
<label for="content">Content</label>
<textarea class="form-control" name="content" id="" cols="5" rows="5">{{ $post->content }}</textarea>
</div>
<div class="form-group">
<div class="text-center">
<button class="btn btn-success" type="submit">Update</button>
</div>
</div>
</form>
</div>
</div>
@stop
Setelah di ubah coba jalankan, maka akan ada tampilan tag di dalam form post. seperti dibawah ini.
Sekian untuk Tutorial Boilerplate Laravel 8: Relasi Tag dan Post