Berbagai macam metode bisa kita buat atau gunakan tentang bagaimana suatu data ditampilkan hanya kepada siapa yang memiliki data tersebut.
Seperti metode Auth
untuk mengakses user yang login dan membuat kondisional untuk menampilkan setiap data yang diperuntukan atau dimiliki user tertentu atau yang sedang login pada aplikasi laravel kita.
Kita akan buat dan mempelajarinya. Sebagai contoh kita akan membuat aplikasi sederhana dengan sistem autentikasi dan sebuah form untuk insert data yang dapat digunakan oleh banyak user berbeda, seperti dibawah ini.
Aplikasi Sederhana Laravel: Instalasi, Database, Migrasi
Mari kita membuatnya. Kita mulai dari instalasi laravel -- versi yang digunakan adalah laravel 8.
laravel new example-app #atau composer create-project laravel/laravel example-app
Selanjutnya buat database MySQL baru lalu kita atur pada file .env
.
MariaDB [(none)]> create database db_example_app; Query OK, 1 row affected (0.032 sec)
//.env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=db_example_app DB_USERNAME=root DB_PASSWORD=
Kita buat buat file migrasi baru untuk kita tambahkan sebuah tabel.
php artisan make:model Post --migration
Buka file migrasi yang baru dibuat dan tambahkan kolom seperti dibawah ini.
//...create_posts_table.php Schema::create('posts', function (Blueprint $table) { $table->id(); $table->foreignId('user_id'); $table->string('title'); $table->text('body'); $table->timestamps(); });
Kolom user_id
akan menyimpan key / ID asing; yaitu ID dari user untuk kita buat relasi antara tabal posts
dan tabel users
.
Terakhir jalankan perintah migrasi.
php artisan migrate
Membuat Autentikasi Login dan Registrasi User
Kita akan gunakan scaffold starter kits laravel untuk membuat sistem atuentikasi agar lebih mudah dan cepat.
Silahkan jalankan pertintah dibawah ini secara berurutan.
composer require laravel/breeze --dev php artisan breeze:install npm install npm run dev php artisan serve
Setelah selesai kita buka http://localhost:8000/
pada browser dan silahkan lakukan registasi di http://localhost:8000/register
dengan lebih dari satu user.
MariaDB [db_example_app]> select id, name, email from users; +----+-------+----------------+ | id | name | email | +----+-------+----------------+ | 1 | user1 | [email protected] | | 2 | user2 | [email protected] | | 3 | user3 | [email protected] | +----+-------+----------------+ 3 rows in set (0.000 sec)
Membuat Data Baru
Kita lanjutkan untuk membuat proses insert data dan membuat halaman khusus dengan form input.
Kita mulai dari membuat sebuah Controller. Silahkan jalankan perintah dibawah ini.
php artisan make:controller PostController
Kemudian buka PostController.php
dan buat seperti dibawah 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) { $post = new Post; $post->title = $request->title; $post->body = $request->body; $post->user_id = Auth::user()->id; $post->save(); return back(); } }
Kita lihat Controller diatas. Pada create()
method akan menampilkan halaman create yang ada di dalam folder post pada direktori views yang nanti kita buat. Lalu pada store()
method, kita gunakan metode Auth
untuk mengakses objek user yang login dan mengambil properti ID untuk value user_id.
Selanjutnya buat folder baru di direktori views dengan nama post dan tambahkan sebuah file create.blade.php didalamnya, lalu buat seperti dibawah ini.
//views/post/create.blade.php <x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Create New Post') }} </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"> <form method="POST" action="{{ route('store') }}"> @csrf <!-- Title --> <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> <!-- Body --> <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"> <a class="underline text-sm text-gray-600 hover:text-gray-900" href="{{ route('dashboard') }}"> {{ __('Cancel ?') }} </a> <x-button class="ml-4"> {{ __('Submit') }} </x-button> </div> </form> </div> </div> </div> </div> </x-app-layout>
Setelah itu kita buka file route web.php dan tambahkan route dibawah ini.
use App\Http\Controllers\PostController; Route::get('/post/create', [PostController::class, 'create'])->name('new-post'); Route::post('/post/store', [PostController::class, 'store'])->name('store');
Kemudian buka layouts > navigation.blade.php untuk kita tambahkan link navigasi.
<!-- Navigation Links --> <div class="hidden space-x-8 sm:-my-px sm:ml-10 sm:flex"> ... <x-nav-link :href="route('new-post')" :active="request()->routeIs('new-post')"> {{ __('Add New Post') }} </x-nav-link> </div>
Simpan dan jalankan perintah php artisan serve
. Sampai disini kita sudah bisa melakukan insert data, silahkan mencobanya.
Silahkan buat lebih dari satu data post dengan user yang berbeda.
MariaDB [db_example_app]> select id, user_id, title, body from posts; +----+---------+---------+--------+ | id | user_id | title | body | +----+---------+---------+--------+ | 1 | 1 | Title 1 | body 1 | | 2 | 1 | Title 2 | body 2 | | 3 | 2 | Title 3 | body 3 | | 4 | 3 | Title 4 | body 4 | +----+---------+---------+--------+ 4 rows in set (0.001 sec)
Menampilkan Data
Sekarang adalah bagaimana kita menampilkan data berdasarkan user tertentu, baik menampilkan data post sesuai user yang login atau menampilkan semua data post beserta user terkait.
Menggunakan metode with
Yang perlu kita lakukan adalah mengetahui atau mengambil informasi user yang sedang login untuk dicocokan dengan data post yang dimilikinya.
Kita akan ambil semua data pada tabel posts untuk ditampilkan. Karena kita juga ingin menampilkan informasi user disetiap post, kita buat relasi pada model untuk dapat melakukan kueri tabel terkait.
Kita buka model Post.php dan tambahkan relasi belongsTo()
seperti dibawah ini.
class Post extends Model { use HasFactory; public function user() { return $this->belongsTo(User::class); } }
Lihat postingan khusus belajar relasi eloquent laravel untuk mempelajari relasi lainnya di laravel.
Selanjutnya kita akan tampilkan data post yang dimiliki user yang login pada halaman dashbord. Silahkan buka route web.php dan buat seperti dibawah ini.
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\PostController; use App\Models\Post; use App\Models\User; Route::get('/', function () { return view('welcome'); }); Route::middleware(['auth'])->group(function () { Route::get('/dashboard', function () { $posts = Post::with('user')->get(); return view('dashboard', ['posts' => $posts]); })->name('dashboard'); Route::get('/post/create', [PostController::class, 'create'])->name('new-post'); Route::post('/post/store', [PostController::class, 'store'])->name('store'); }); require __DIR__.'/auth.php';
Selanjutnya buka file dashboard.blade.php dan kita buat loop foreach seperti dibawah ini.
<x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Dashboard') }} </h2> </x-slot> <div class="py-8"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> @foreach ($posts as $post) @if ($post->user->id == Auth::user()->id) <div class="p-6 bg-white border-b border-gray-200"> <h1 class="text-2xl">{{ $post->title }}</h1> <p>by {{ $post->user->name }}</p> </div> @endif @endforeach </div> </div> </div> </x-app-layout>
Di dalam @foreach
diatas, kita buat kondisional @if
dengan operator persamaan (==), menyandingkan ID user yang login dengan ID user yang ada di setiap post. Jika cocok (true) maka akan ditampilkan.
Menggunakan metode where
Kita juga dapat membandingkan nilai kolom tabel dengan nilai argumen saat kueri dengan menambahkan klausa where
untuk mengambil data record yang sesuai.
//web.php ... Route::get('/dashboard', function () { $posts = Post::with('user')->where('user_id', Auth::user()->id)->firstOrFail(); return view('dashboard', ['posts' => $posts]); })->name('dashboard'); ...
Silahkan hapus kondisional yang ada di dashboard.blade.php.
//dashboard.blade.php ... @foreach ($posts as $post) <div class="p-6 bg-white border-b border-gray-200"> <h1 class="text-2xl">{{ $post->title }}</h1> <p>by {{ $post->user->name }}</p> </div> @endforeach ...
Hasilnya seperti gambar dibawah ini.
Menampilkan semua data dan user terkait
Kita akan tambahkan sebuah halaman untuk menampilkan semua post yang ada, baik yang dimiliki user yang sedang login ataupun yang dimilki user lain.
Kita tambahkan file baru di folder post dengan nama posts.blade.php, lalu tambahkan html dengan foreach yang sama seperti dibawah ini; atau bisa copas dari dashboard.blade.php.
<x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Posts') }} </h2> </x-slot> <div class="py-8"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> @foreach ($posts as $post) <div class="p-6 bg-white border-b border-gray-200"> <h1 class="text-2xl">{{ $post->title }}</h1> <p>by {{ $post->user->name }}</p> </div> @endforeach </div> </div> </div> </x-app-layout>
Selanjutnya tambahkan mothod baru pada PostController.php
dengan kueri model eloquent dan relasi yang sama, seperti dibawah ini.
public function index() { $posts = Post::with('user')->get(); return view('post.posts', ['posts' => $posts]); }
Kemudian tambahkan route baru dibawah ini pada web.php. Letakan di dalam group middleware auth.
Route::get('/posts', [PostController::class, 'index'])->name('posts');
Tambahkan juga link navigasi-nya.
//navigation.blade.php <x-nav-link :href="route('posts')" :active="request()->routeIs('posts')"> {{ __('All Posts') }} </x-nav-link>
Simpan dan lihat hasilnya pada browser. Hasilnya seperti gambar dibawah ini.
Selesai
Demikian cara menampilkan data sesuai user yang login. Yang kita lakukan adalah mengakses user yang diatuentikasi dan melakukan filterisasi pada kueri data menggunakan kondisional dan mancari kesamaan nilai / value.
Silahkan dicoba.