Tutorial laravel Seeder, Aplikasi Inventory Part 3

tutorial laravel

Artikel Tutorial laravel Menggunakan Seeder ini merupakan lanjutan dari artikel sebelumnya (https://soft-gain.com/2020/05/29/hak-akses-user-menggunakan-laravel-aplikasi-stok-barang-part-2/). Artikel tutorial laravel menggunakan seeder kali ini tidak akan terlalu panjang karena hanya akan membahas bagaimana cara menggunakan seeder pada Laravel. Seeder sendiri biasa nya di pakai untuk pengisian data dummy pada database untuk keperluan testing, hanya saja pada kali ini kita akan mencoba mengimplementasikan fitur seeder ini untuk men-format atau refresh table users pada aplikasi inventory yang coba kita kembangkan ini. Untuk detail tentang seeder bisa di lihat di dokumentasi resminya (https://laravel.com/docs/7.x/seeding).

Pertama-tama kita akan membuat seeder baru, pembuatan seeder bisa di lakukan melalui CMD dengan mengetikan perintah berikut ini :

php artisan make:seed namaSeederBaru

Atau bisa di lihat pada gambar ini :

tutorial laravel seeder
Pembuatan Seeder

Berikutnya buka file seeder yang baru saja kita buat, letak nya ada di database/seeds/reformatTableUser.php. Dan ubah isinya seperti gambar di bawah ini :

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;

class reformatTableUser extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::statement("truncate table users");

        DB::table('users')->insert([
	    'name' => 'Admin',
            'email' => 'admin@soft-gain.com',
            'password' => Hash::make('12345678'),
            'role' => 'admin',
		]);
    }
}

Perhatikan di atas, didalam method run kita bisa menyisipkan berbagai operasi yang berhubungan dengan database. Contohnya sata menggunaan DB::statement yang bisa di gunakan untuk mengeksekusi RAW sql statement, dan saya juga menggunakan statement db insert untuk meng-inject data baru pada database.

Dan ini adalah kondisi dari table users sebelum seeder di jalankan :

tutorial laravel seeder

Didalam nya masih berisi 3 data default sebelum seeder di jalankan. Berikutnya kita coba jalankan perintah seeder untuk men-format table users di atas. Jalan kan perintah seperti di bawah ini :

tutorial laravel seeder
Jalankan Seeder

Penting! Saya secara peribadi lebih suka menjalankan seeder secara specific dengan menyisipkan perintah –class=namaSeeder. Karena jika kita hanya menjalankan perintah tanpa specific class (php artisan db:seed) maka semua seeder yang pernah di buat akan di jalankan sekaligus, tentu hal ini sangat tidak baik karena dapat merusak environment database yang kita punya sekarang.

Dan ini lah hasil dari seeder yang sudah kita jalankan :

Bisa di lihat di atas data yang sebelumnya ada 3 menjadi hanya 1 buah saja sesuai dengan seeder yang kita jalankan.

Kesimpulannya, saya pribadi suka memakai seeder bukan hanya sebagai peng-inject data testing, tapi terkadang juga saya suka memanfaatkannya untuk kebutuhan lain seperti insert atau update data berukuran besar yang memerlukan pengeksekusian dari sisi aplikasi / laravel dalam hal ini. Untuk full source nya bisa di ambil di repo saya (https://github.com/ImmanuelJL/belajar-laravel). Sekian terima kasih.

Tutorial laravel Auth Permission, Aplikasi Inventory Part 2

tutorial laravel

Artikel Tutorial laravel Auth Permission ini merupakan lanjutan dari artikel sebelumnya (https://soft-gain.com/2019/10/17/laravel-aplikasi-stok-barang-part-1/) ini adalah artikel aplikasi stok barang dengan laravel part 2. Di bagian ini juga kita akan mengimplementasikan tutorial pembuatan auth permission menggunakan laravel, hal ini akan kita lakukan dengan memanfaatan middleware sesuai dengan artikel sebelumnnya juga yaitu (https://soft-gain.com/2020/05/09/menggunakan-middleware-pada-laravel/). Hak akses user menggunakan laravel yang akan kita implementasikan kali ini sederhana saja, hanya ada admin dan user, pada iplementasi nya bisa dikembangkan sesuai kebutuhan.

Langkah pertama adalah, buat lah lebih dahulu middleware baru dengan nama CheckUserStatus (langkah-langkah pembuatannya bisa di lihat di artikel tentang pembahasan middleware). Isi dari CheckUserStatus adalah sebagai berikut :

<?php

namespace App\Http\Middleware;

use Closure;

class CheckUserStatus
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(\Auth::user()->role === 'admin') {
            return $next($request);
        }

        return redirect('restricted-page');
    }
}

Lalu tambahkan pada kernel.php pada bagian $routeMiddleware, karena kita akan memanfaatkan router untuk mengimplementasikan middleware yang sudah di buat. Kurang lebih jadi seperti ini :

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'role' => \App\Http\Middleware\CheckUserStatus::class, // <--- INI MIDDLEWARE BARU KITA
    ];

Berikutnya, karena kita akan memanfaatkan table dan model yang sudah ada yaitu table dan model users, maka kita perlu membuat beberapa perubahan agar table dan model ini bisa kita modifikasi sesuai kebutuhan kita.

(Catatan : saya lebih memilih untuk membuat controller dan views baru dari pada merubah default yang sudah di sediakan oleh laravel, karena menurut saya ini akan lebih mudah di pahami dari pada merubah default milik laravel yang sudah banyak menggunakan class dari repositori bawaannya).

Selanjutnya buat lah migration, karena kita hendak meng-update table users yang sudah ada sebelumnya. Petunjuk pembuatan migration bisa di lihat di sini (https://soft-gain.com/2019/07/10/cara-dan-penjelasan-migration-pada-laravel/). Kurang lebih seperti ini lah migration yang di buat :

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class UpdateTableUsersAddColumnRole extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users',function($table){
            $table->string('role')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users',function($table){
            $table->dropColumn('role');
        });
    }
}

Bisa di lihat di atas kita menambahkan kolom role pada table users, kolom ini lah yang akan kita jadikan acuan user memiliki hak akses atau tidak. Jangan lupa juga untuk modifikasi sedikit model users nya, kurang lebih jadi seperti ini :

protected $fillable = [
    'name', 'email', 'password', 'role',
];

Selanjutkan kita akan buat controller nya, di sini saya memberi nama sg_user.php, isi di dalamnya kurang lebih seperti ini :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User as model;
use Illuminate\Support\Facades\Hash;

class sg_user extends Controller
{
    public function index(){
    	$users = model::all();

    	return view('user.table',compact('users'));
    }

    public function create(){
    	return view('user.form');
    }

    public function store(Request $request){
    	if($request->password == '' || $request->password_confirmation == ''){
    		return \Redirect::back()->with('status','Error, Password Is Empty.');
    	}

    	if($request->password !== $request->password_confirmation){
    		return \Redirect::back()->with('status','Error, Password Confirmation Not Match.');
    	}

    	model::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            'role' => $request->role,
        ]);

    	return redirect('user');
    }

    public function show(){
    	//
    }

    public function edit($id){
    	$editForm = true;
    	$users = model::find($id);

    	return view('user.form',compact('users','editForm'));
    }

    public function update(Request $request, $id){
    	$request = (object) $request->except('_method', '_token');

    	if($request->password !== '' && $request->password_confirmation !== '' && $request->password !== $request->password_confirmation){
    		return \Redirect::back()->with('status','Error, Password Confirmation Not Match.');
    	}

    	model::where('id',$id)->update([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            'role' => $request->role,
        ]);

    	return redirect('user');
    }

    public function destroy($id){
    	model::destroy($id);

    	return redirect('user');
    }
}

Jika tertarik tentang penjelasan controller di atas, bisa di lihat di artikel ini (https://soft-gain.com/2019/07/21/crud-pada-laravel-mysql/).

Berikutnya kita tambahkan menu untuk akses table user pada file home.blade.php, tambahkan bagian ini pada menu list :

<div class="links">
      <a href="{{ url('user') }}">Table User</a>
</div>

Selanjutnya kita akan buat tampilan untuk user list nya / table user nya, kita tambahkan folder baru dengan nama user pada folder views, lalu di dalamnya tambahkan file table.blade.php, isi dari file table.blade.php seperti ini :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table User</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    <div class="table-responsive">
                        <a class="btn btn-primary" href="{{ url('user/create') }}">
                            Tambah Data
                        </a>
                        <p></p>
                        <table class="table table-hover table-striped table-bordered">
                            <thead>
                                <tr>
                                    <th class="text-center">Nama</th>
                                    <th class="text-center">Email</th>
                                    <th class="text-center">Role</th>
                                    <th class="text-center"> </th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($users as $user)
                                    <tr>
                                        <td>{{ $user->name }}</td>
                                        <td>{{ $user->email }}</td>
                                        <td>{{ $user->role }}</td>
                                        <td>
                                            <a href="{{ URL::route('user.edit',$user->id) }}"><i class="fas fa-edit"></i></a>
                                            <a href="{{ url('user/destroy/'.$user->id) }}"><i class="fas fa-trash-alt"></i></a>
                                        </td>
                                    </tr>
                                @endforeach
                            </tbody>
                        </table>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Selanjutnya kita buat juga file form.blade.php di folder yang sama, isi nya seperti ini :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table User</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="form-group col-xs-12 col-lg-12">
                            <div class="alert alert-danger" role="alert">
                                {{ session('status') }}
                            </div>
                        </div>
                    @endif

                    @if(isset($editForm))
                        {!! Form::model('', ['url' => url('/user/'.$users->id), 'method' => 'put']) !!}
                    @else
                        {!! Form::model('', ['url' => url('/user'), 'method' => 'post']) !!}
                    @endif
                        {{ csrf_field() }}
                        
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Nama</label>
                            {{ Form::text('name', isset($users->name) ? $users->name : null, ['class' => 'form-control', 'required']) }}
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Email</label>
                            {{ Form::email('email', isset($users->email) ? $users->email : null, ['class' => 'form-control', 'required']) }}
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Password</label>
                            <input type="password" class="form-control" name="password" autocomplete="new-password">
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Password Confirmation</label>
                            <input type="password" class="form-control" name="password_confirmation" autocomplete="new-password">
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Role</label>
                            {{ Form::select('role', ['admin'=>'admin', 'user'=>'user'], isset($users->role) ? $users->role : null, ['class' => 'form-control', 'placeholder'=>'Pilih', 'required']) }}
                        </div>

                        <div class="form-group col-xs-12 col-lg-12">
                            <button type="submit" class="btn btn-success">
                                Simpan
                            </button>
                        </div>
                    {!! Form::close() !!}

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Berikutnya kita akan membuat file restricted-page.blade.php, file ini hanya berisi tampilan text saja yang akan menjadi landing page jika user yang hendak mengakses module tertantu tapi tidak memiliki akses, isi nya seperti ini :

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>

        <!-- Fonts -->
        <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">

        <!-- Styles -->
        <style>
            html, body {
                background-color: #fff;
                color: #636b6f;
                font-family: 'Nunito', sans-serif;
                font-weight: 200;
                height: 100vh;
                margin: 0;
            }

            .full-height {
                height: 100vh;
            }

            .flex-center {
                align-items: center;
                display: flex;
                justify-content: center;
            }

            .position-ref {
                position: relative;
            }

            .top-right {
                position: absolute;
                right: 10px;
                top: 18px;
            }

            .content {
                text-align: center;
            }

            .title {
                font-size: 84px;
            }

            .links > a {
                color: #636b6f;
                padding: 0 25px;
                font-size: 13px;
                font-weight: 600;
                letter-spacing: .1rem;
                text-decoration: none;
                text-transform: uppercase;
            }

            .m-b-md {
                margin-bottom: 30px;
            }
        </style>
    </head>
    <body>
        <div class="flex-center position-ref full-height">
            <div class="content">
                <div class="title m-b-md">
                    Sorry, You Has No Access.
                </div>
            </div>
        </div>
    </body>
</html>

Terakhir kita tambahkan beberapa baris baru ada router kita.

Route::get('/restricted-page', function () {
    return view('restricted-page');
});

Route::group(['prefix' => '', 'middleware' => ['role']], function() {
    Route::resource('/user', 'sg_user');
    Route::get('/user/destroy/{id}', 'sg_user@destroy');
});

Seperti yang terlihat di atas, kita menambahkan router untuk akses ke menu user di dalam router group yang kita sisipkan juga middleware yang baru saja kita buat sebelumnya (penamaan middleware role kita dapatkan sesuai dengan apa yang kita daftarkan sebelumnya pada file kernel.php). Jadi cara kerjanya adalah, hanya user dengan role admin lah yang bisa mengakses, selain itu di alihkan ke halaman restricted (hal itu di aplikasikan berdasarkan code bagian yang ini).

if(\Auth::user()->role === 'admin') {
    return $next($request);
}

return redirect('restricted-page');

Berikut ini tampilan dari apa yang sudah kita kerjakan di atas.

Tampilan Table User

Seperti yang bisa di lihat di atas, kita memiliki beberapa sample user dengan role yang berbeda, role yang di pakai di sini hanya 2 yaitu admin / user.

Tampilan Form User

Dan di atas ini adalah tampilan dari form user, baik buat baru atau edit yang sudah ada kita akan gunakan form yang sama.

Tampilan Halaman Tidak Memiliki Akses

Dan terakhir adalah landing page jika user tidak memiliki role akses yang di butuhkan.

Demikian lah cara pembuatan hak akses user pada laravel, seperti yang bisa di lihat di atas, ini hanya lah contoh yang sangat sederhana sekali dari sebuah skema access user controlling. Dengan memanfaatkan middlware ini pembatasan akses user bisa lebih di maksimalkan lagi dengan lebih dinamis, misalnya user A hanya bisa buat dan update data tetapi tidak bisa hapus data, sedangkan user B hanya bisa melihat list data tanpa bisa modifikasi data. Untuk full source nya bisa di ambil di git repo saya, ambil dari branch aplikasi-stok-barang (https://github.com/ImmanuelJL/belajar-laravel).

Sekian artikel ini, kiranya masih di berikan kesempatan untuk di lanjutkan lagi ke bagian 3. Terima kasih.

(Catatan : Setelah proses migration bisa di update manual column role nya karena value nya masih NULL, di lain kesempatan akan saya coba buatkan seeder nya supaya pada proses implemetasi bisa lebih efektif).

Menggunakan Middleware Pada Laravel

tutorial laravel

Berikut ini saya hendak membagikan pengalaman saya menggunakan middleware pada laravel. Middleware atau yang di nama kan filter pada laravel 4 (dengan konsep yang agak berbeda) ini berfungsi sebagai penengah dari request yang masuk ke aplikasi kita, contohnya seperti men-check status login user atau bisa juga di gunakan untuk custom authentifikasi pada user. Secara garis besar middleware ini bertugas men-jembatani antara request yang masuk dan controller mana yang di tuju. Contoh real case nya adalah, saya biasanya manfaatkan middleware ini untuk membedakan mana user dengan status admin dan mana yang non admin. Namun sebelum masuk ke tahap tersebut ada baiknya kita mengenal dasar-dasar dari middleware ini. Berikut adalah pengalaman saya menggunakan middleware pada laravel .

Untuk membuat middleware baru, tinggal ketikan perintah berikut ini di cmd :

php artisan make:middleware CheckUserStatus

Jika berhasil maka secara otomatis kita akan di buatkan file baru di dalam folder \app\Http\Middleware, dan nama filenya sama dengan nama middleware yang baru kita buat (CheckUserStatus.php). Jika di buka kurang lebih isi nya seperti ini :

<?php

namespace App\Http\Middleware;

use Closure;

class CheckUserStatus
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Seperti yang kita lihat di atas, sudah di sediakan satu method dengan nama handle, di dalam method ini lah kita akan mendefinisikan filter seperti apa yang hendak kita gunakan atau kita aplikasikan. Contoh kita akan membatasi hanya user admin yang memiliki previllage untuk meng-akses halaman tertentu :

public function handle($request, Closure $next)
{
        if(Auth::user()->role === 'admin') {
            return $next($request);
        }

        return redirect('restricted-page');
}

Dari contoh di atas, kita melakukan pengecekan apakah user yang hendak meng-akses memiliki role admin atau tidak, jika ya maka request di teruskan dengan memangil return $next($request); namun apabila tidak maka user kita alihkan ke halaman restricted-page.

Ada 3 cara untuk mengimplementasikan middleware yang sudah kita buat, secara global, pada routes tertentu atau pada controller tertentu. Untuk menggunakannya secara global buka file app/Http/Kernel.php dan kita tinggal menambahkan middleware yang sudah kita buat tadi ke dalam attribute protected $middleware, sehingga menjadi :

protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,  
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckUserStatus::class, // <- middleware baru
    ];

Untuk menggunakannya pada routes tertantu buka file app/Http/Kernel.php dan kita tinggal menambahkan middleware yang sudah kita buat tadi ke dalam attribute protected $routeMiddleware, sehingga menjadi :

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'role' => \Illuminate\Auth\Middleware\CheckUserStatus::class, // <- middleware baru
    ];

Setelahnya kita tinggal meambahkan middleware tersebut ke dalam routes.php. Contoh nya :

Route::group(['prefix' => '', 'middleware' => ['role']], function() {
    // ROUTE KHUSUS UNTUK ROLE ADMIN
});

Saya sendiri memanfaatkan router group untuk memudahkan pemetaan pada route mana saja middleware tsb hendak saya aplikasikan. Untuk penjelasan tentang router bisa di lihat pada https://soft-gain.com/2019/10/09/router-pada-laravel/

Terakhir kita akan mendaftarkan nya pada controller tertentu. Bedanya, jika di daftarkan pada controller tertentu kita bisa memilih atau pun men-exclude method tertentu. Contoh nya seperti ini :

class sg_barang extends Controller
{
    function __construct()
    {
        $this->middleware('role');
        $this->middleware('selected-middleware', ['only' => ['method-a', 'method-b']]); // memilih method tertentu
        $this->middleware('exclude-middleware', ['except' => ['method-c']]) ; // men-exclude method tertentu
    }
}  

Demikian lah sedikit yang bisa saya bagikan perihal middleware pada laravel, untuk lebih jelas nya tentu bisa merujuk pada dokumetasi resmi nya https://laravel.com/docs/master/middleware.

Terima Kasih.

Fitur Multi Bahasa Laravel

tutorial laravel

Kali ini saya hendak membagikan pengalaman saya tentang bagaimana cara menggunakan fitur multi bahasa pada framework laravel. Dengan memanfaatkan multi localization yang sudah ada pada laravel, fitur ini sebenarnya tidak lah sulit untuk di buat, bahkan kita juga bisa membuat dua, tiga bahkan empat bahasa sekalipun sesuai kebutuhan. Di artikel ini saya hanya memfokuskan pada implementasi dasar nya saja, selanjutnya fitur ini bisa di kembangkan sesuai kebutuhan.

Disini saya menggunakan laravel versi 5.8, dan saya memanfaatkan segment pada url untuk menentukan bahasa mana yang hendak di pakai pada tampilan website. Pertama-tama tambahkan code ini pada router :

Route::group(['prefix' => '{locale}'], function() {
	if (in_array(Request::segment(1), config('app.locales'))) {
        App::setLocale(Request::segment(1));

        Route::get('/multi-bahasa', function () {
	       return view('multi-bahasa');
        });
    }
});

Kita memanfaatkan router group untuk memudahkan pemetaan bahasa, dimana prefix-nya kita isi sebagai variable yang akan menjadi parameter bahasa mana yang hendak di gunakan. Untuk sedikit penjelasan tentang router pada laravel bisa di baca di sini (https://soft-gain.com/2019/10/09/router-pada-laravel/).

Berikut nya buka file config/app.php dan tambahkan code berikut ini :

'locales' => ['id', 'en'],

Array di atas bisa di sesuaikan dengan kebutuhan berapa bahasa yang hendak di pakai, untuk contoh kal ini 2 saja dulu yaitu Indonesia dan Inggris.

Berikutnya buka folder resources/lang perhatikan di sini, default nya hanya tersedia satu lang saja yaitu en / english, karena kita hendak menambahkan lang baru yaitu bahasa Indonesia maka tambahkan satu folder id (atau lebih mudahnya saya copy folder en dan saya rename menjadi id). Buka file auth.php pada folder id (resources/lang/id/auth.php) dan tambahkan code berikut :

'label_welcome_header' => 'Selamat Datang',
'label_welcome_content' => 'Ini adalah Bahasa.',

Dan tambahkan code berikut pada auth.php pada folder en (resources/lang/en/auth.php) :

'label_welcome_header' => 'Welcome',
'label_welcome_content' => 'This is English.',

Perhatikan di atas kedua nya memiliki key yang sama, sedangan value nya berbeda di sesuaikan dengan bahasa yang ingin di pakai.

Selanjutnya kita membuat view baru dengan nama multi-bahasa, isi nya kurang lebih seperti ini :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">@lang('auth.label_welcome_header')</div>

                <div class="card-body">
                    <div class="content">
                        <div class="title m-b-md">
                            @lang('auth.label_welcome_content')
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Dari view di atas, bisa dilihat kita menggunakan @lang(), nah fungsi ini lah yang akan kita pakai untuk menggunakan/menampilka bahasa secara dinamis sesuai dengan url prefix yang kita gunakan. Penggunaannya adalah @lang(‘name_file.key’), dan ini contoh hasilnya :

Menggunakan Bahasa Inggris
Menggunakan Bahasa Indonesia

Perhatikan URL di atas, jika yang kita pakai prefix en maka yang tampil adalah bahasa Inggris dan jika kita pakai prefix id maka yang tampil adalah bahasa Indonesia. Full source bisa diambil di repo saya (https://github.com/ImmanuelJL/belajar-laravel).

Demikian lah hanya sedikit dari apa yang saya coba bagikan, mohon maaf jika terdapat banyak kekurangan. Terima Kasih

Aplikasi Inventory Barang Berbasis Web Dengan Laravel

tutorial laravel

Pada kesempatan kali ini, saya bermaksud untuk membuat aplikasi inventory barang berbasis web menggunakan laravel. Aplikasi
inventory barang berbasis web dengan laravel ini sangat sederhana sekali karena sebagian besar adalah peng-aplikasian apa yang sudah di bahas pada artikel sebelumnya (https://soft-gain.com/2019/07/21/crud-pada-laravel-mysql/), di artikel sebelumnya ini kita telah membuat table barang dan akan kita lanjutkan dengan table transaksinya.

Goals – mampu membuat aplikasi inventory berbasis web

Tujuan dari pembahasan artikel ini diharapkan kita berhasil men-implementasi-kan dasar-dasar materi seputar frame work laravel kedalam sebuah real study case (dalam hal ini menjadi sebuah aplikasi inventory atau aplikasi stok barang). Dalam tutorial ini kita akan coba implementasi-kan adalah hal-hal umum dan dasar seperti pembuatan form, table, export – import data dalam bentuk excel, pemanfaatan middleware untuk membatasi hak akses user, menyembunyikan parameter id pada url dengan teknik obfuscation dan lain-lain.

Dan jika masih diberikan kesempatan saya juga bermaksud mengembangkannya menjadi sebuah web service serta pen-aplikasian-nya ke dalam aplikasi berbasis android (jadi mari kita belajar bersama-sama langsung dari hulu sampai hilir hanya saja dengan contoh yang sangat sederhana dengan maksud supaya mudah dipahami), kurang lebih seperti ini lah tampilan dari aplikasi berbasis website yang akan kita buat :

Table Transaksi
Form Transaksi

Materi pembuatan aplikasi inventory berbasis web

Tanpa berlama-lama lagi kita langsung saja masuk pada pembuatan aplikasi ini. Pertama-tama kita akan membuat satu table baru yaitu table sg_transaksi, pada table ini kita akan mencatat masuk dan keluarnya barang pada sistem. Langsung saja buat migration seperti ini :

Inventory Barang Berbasis Web

Untuk file migrasi nya di isi seperti ini :

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTableTransaksi extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('sg_transaksi', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('id_barang')->nullable();
            $table->string('jenis_transaksi')->nullable();
            $table->bigInteger('jumlah_barang')->nullable();
            $table->bigInteger('created_by')->nullable();
            $table->bigInteger('updated_by')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('sg_transaksi');
    }
}

Berikutnya kita akan membuat model sg_transaksi. Ada kolom id_barang yang akan menjadi relasi antara table barang dan transaksi, jenis transaksi dan jumlah barangnya. Isi dari model sg_transaksi seperti ini :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class sg_transaksi extends Model
{
    protected $table = 'sg_transaksi';

    protected $fillable = [
    	'id_barang',
    	'jenis_transaksi',
    	'jumlah_barang',
    	'created_by',
    	'updated_by'
    ];

    public function getNamaBarang(){
    	return $this->hasOne(sg_barang::class, 'id', 'id_barang');
    }

    public function getCreatedBy(){
    	return $this->hasOne(User::class, 'id', 'created_by');
    }

    public function getUpdatedBy(){
    	return $this->hasOne(User::class, 'id', 'updated_by');
    }
}

Berikutnya adalah sg_transaksi controller. Isinya seperti ini :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\sg_transaksi as model;
use App\sg_barang;

class sg_transaksi extends Controller
{
    public function index(){
    	$transaksis = model::with('getNamaBarang','getCreatedBy','getUpdatedBy')->orderBy('id','desc')->get();

    	return view('transaksi.table',compact('transaksis'));
    }

    public function create(){
    	$id_barang = sg_barang::pluck('nama_barang','id');

    	return view('transaksi.form',compact('id_barang'));
    }

    public function store(Request $request){
    	model::create($request->all());

    	$this->updateSgBarang($request);	

    	return redirect('transaksi');
    }

    public function show(){
    	//
    }

    public function edit($id){
    	$editForm = true;
    	$transaksis = model::with('getNamaBarang')->find($id);
    	$id_barang = sg_barang::pluck('nama_barang','id');

    	return view('transaksi.form',compact('transaksis','editForm','id_barang'));
    }

    public function update(Request $request, $id){
    	$this->updateSgBarang($request, $id);

        $data = $request->except('_method', '_token');
    	model::where('id',$id)->update($data);    	

    	return redirect('transaksi');
    }

    public function destroy($id){
    	$value = model::where('id',$id);
    	$sg_barang = sg_barang::where('id',$value->value('id_barang'));

        if( $value->first()->jenis_transaksi == 'Masuk' ){
            $sg_barang->update(["jumlah_barang"=>(int) $sg_barang->value('jumlah_barang') - (int) $value->first()->jumlah_barang]);
        }elseif( $value->first()->jenis_transaksi == 'Keluar' ){
            $sg_barang->update(["jumlah_barang"=>(int) $sg_barang->value('jumlah_barang') + (int) $value->first()->jumlah_barang]);
        }
    	model::destroy($id);

    	return redirect('transaksi');
    }

    public function updateSgBarang($request, $idTrx=''){
    	$sg_barang = sg_barang::where('id',$request->id_barang);
    	$value = $sg_barang->value('jumlah_barang');

        if( $idTrx != '' ){
            $trx = model::where('id',$idTrx)->first();            
            if( $trx->jenis_transaksi == 'Masuk' ){
                $sg_barang->update(["jumlah_barang"=>(int) $value - (int) $trx->jumlah_barang]);
            }elseif( $trx->jenis_transaksi == 'Keluar' ){
                $sg_barang->update(["jumlah_barang"=>(int) $value + (int) $trx->jumlah_barang]);
            }
            $value = sg_barang::where('id',$request->id_barang)->value('jumlah_barang');
        }

    	if( $request->jenis_transaksi == 'Masuk' ){
    		$sg_barang->update(["jumlah_barang"=>(int) $value + (int) $request->jumlah_barang]);
    	}elseif( $request->jenis_transaksi == 'Keluar' ){
    		$sg_barang->update(["jumlah_barang"=>(int) $value - (int) $request->jumlah_barang]);
    	}
    }
}

Pada controller transaksi ini, di luar fungsi-fungsi default bawaan laravel seperti index, create, store dan lain-lain, kita menambahkan satu fungsi baru yaitu updateSgBarang(). Fungsi ini akan kita panggil pada fungsi store dan update, yang akan kita gunakan untuk men-sinkronkan antara data barang yang masuk dan barang yang keluar dari table Barang.

Selanjutnya tambahkan kode berikut ini pada file router :

Route::resource('/transaksi', 'sg_transaksi');
Route::get('/transaksi/destroy/{id}', 'sg_transaksi@destroy');

Untuk view-nya, tambahkan satu buah folder baru yaitu transaksi dan di dalamnya kita buat dua buah file yaitu table.blade.php dan form.blade.php. Untuk list table kita akan pakai table.blade.php. Isi table.blade.php seperti ini :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table Transaksi</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    <div class="table-responsive">
                        <a class="btn btn-primary" href="{{ url('transaksi/create') }}">
                            Tambah Data
                        </a>
                        <p></p>
                        <table class="table table-hover table-striped table-bordered">
                            <thead>
                                <tr>
                                    <th class="text-center">Nama Barang</th>
                                    <th class="text-center">Jenis Transaksi</th>
                                    <th class="text-center">Jumlah Transaksi</th>
                                    <th class="text-center">Dibuat Oleh</th>
                                    <th class="text-center">Terakhir Ubah</th>
                                    <th class="text-center"> </th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($transaksis as $transaksi)
                                    <tr>
                                        <td>{{ $transaksi->getNamaBarang->nama_barang }}</td>
                                        <td>{{ $transaksi->jenis_transaksi }}</td>
                                        <td>{{ $transaksi->jumlah_barang }}</td>
                                        <td>{{ $transaksi->getCreatedBy->name }}</td>
                                        <td>{{ isset($transaksi->getUpdatedBy) ? $transaksi->getUpdatedBy->name : '-' }}</td>
                                        <td>
                                            <a href="{{ URL::route('transaksi.edit',$transaksi->id) }}"><i class="fas fa-edit"></i></a>
                                            <a href="{{ url('transaksi/destroy/'.$transaksi->id) }}"><i class="fas fa-trash-alt"></i></a>
                                        </td>
                                    </tr>
                                @endforeach
                            </tbody>
                        </table>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Untuk tampilan form inputan kita akan membuat file baru yaitu form.blade.php. Isi file form.blade.php seperti ini :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table Transaksi</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    @if(isset($editForm))
                        {!! Form::model('', ['url' => url('/transaksi/'.$transaksis->id), 'method' => 'put']) !!}
                        {{ Form::hidden('updated_by', Auth::user()->id, ['class' => 'form-control']) }}
                    @else
                        {!! Form::model('', ['url' => url('/transaksi'), 'method' => 'post']) !!}
                        {{ Form::hidden('created_by', Auth::user()->id, ['class' => 'form-control']) }}
                    @endif
                        {{ csrf_field() }}
                        
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Nama Barang</label>
                            {{ Form::select('id_barang', $id_barang, isset($transaksis->id_barang) ? $transaksis->id_barang : null, ['class' => 'form-control', 'placeholder'=>'Pilih']) }}
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Jenis Transaksi</label>
                            {{ Form::select('jenis_transaksi', ['Masuk'=>'Masuk','Keluar'=>'Keluar'], isset($transaksis->jenis_transaksi) ? $transaksis->jenis_transaksi : null, ['class' => 'form-control', 'placeholder'=>'Pilih']) }}
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Jumlah Transaksi</label>
                            {{ Form::number('jumlah_barang', isset($transaksis->jumlah_barang) ? $transaksis->jumlah_barang : null, ['class' => 'form-control']) }}
                        </div>

                        <div class="form-group col-xs-12 col-lg-12">
                            <button type="submit" class="btn btn-success">
                                Simpan
                            </button>
                        </div>
                    {!! Form::close() !!}

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Penutup

Selesai sudah pembuatan table transaksi pada aplikasi stok barang ini, pada artikel berikutnya kita akan membuat module untuk membatasi hak akses user sebagai tahap selanjutnya. Source code utuhnya seperti biasa bisa di ambil di git milik saya (https://github.com/ImmanuelJL/belajar-laravel/tree/aplikasi-stok-barang), silahkan ambil dari cabang aplikasi-stok-barang. Demikian, terima kasih.

Update :

Part 2 : https://soft-gain.com/2020/05/29/hak-akses-user-menggunakan-laravel-aplikasi-stok-barang-part-2/

Part 3 : https://soft-gain.com/2020/05/30/tutorial-laravel-menggunakan-seeder-aplikasi-inventory-part-3/

Part 4 : https://soft-gain.com/2020/06/05/design-website-dengan-bootstrap-aplikasi-inventory-part-4/

Part 5 : https://soft-gain.com/2020/06/07/kirim-email-menggunakan-laravel-dan-smtp-gmail/

Part 6 : https://soft-gain.com/2020/06/10/tutorial-export-excel-laravel-aplikasi-inventory-part-6/

Part 7 (Pengembangan REST API) : https://soft-gain.com/2020/06/12/tutorial-laravel-rest-api-menggunakan-otentikasi-passport/

Part 8 (Pengembangan REST API) : https://soft-gain.com/2020/06/13/tutorial-laravel-membuat-aplikasi-web-service/

Part 9 (Pengembangan Aplikasi Berbasis Android) : https://soft-gain.com/2020/06/19/cara-membuat-aplikasi-android-rest-api-menggunakan-retrofit/

Part 10 : https://soft-gain.com/2020/06/19/tutorial-laravel-import-excel-ke-database/

Part 11 : https://soft-gain.com/2020/06/20/menyembunyikan-id-pada-url-tutorial-laravel-obfuscation/

Part 12 (Pengembangan Aplikasi Berbasis Android) : https://soft-gain.com/2020/06/23/contoh-sederhana-recyclerview-cardview-dengan-implementasi-retrofit/

Part 13 (Pengembangan Aplikasi Berbasis Android) : https://soft-gain.com/2020/06/28/aplikasi-crud-android-database-mysql-menggunakan-retrofit-dan-laravel/

Router Pada Laravel

tutorial laravel

Router pada laravel, apa itu router? Pada artikel ini saya hanya akan berbagi berdasarkan pengalaman saya sendiri, saya sendiri kali ini menggunakan laravel versi 5.8, dimana pada versi laravel ini file router-nya sudah di pisahkan berdasarkan fungsi dan kegunaannya (ada web.php untuk router webnya, ada api.php untuk penggunaan route api dll). Sebetulnya, pada artikel sebelumnya (https://soft-gain.com/2019/07/21/crud-pada-laravel-mysql/) router sudah pernah kita pakai, artikel ini hanya mencoba menjelaskan lebih mendalam tentang apa itu router dan beberapa fitur yang tersedia di dalamnya.

Router sendiri terdiri dari beberapa http method request yang bisa di pakai, seperti GET, POST, PUT, DELETE dan lain-lain. Untuk pembahasan kali ini kita akan coba menggunakan method GET. Buka file router web.php dan coba ketikan code berikut :

Route::get('/coba', function(){
    return 'Berhasil!';
});

Maka seharusnya keluar hasil seperti ini :

Pada contoh di atas, kita mendaftarkan ‘coba’ pada router dengan menggunakan method get. Lalu pada address URL kita tinggal panggil sesuai dengan apa yang sudah di daftarkan.

Kita juga bisa menambahkan parameter yang bersifat dinamis pada router yang hendak kita daftarkan, contohnya seperti ini :

Route::get('/coba/{parameter}', function($parameter){
    return 'Parameternya adalah '.$parameter;
});

Hasilnya seperti ini :

Fitur parameter ini tentu saja bisa kita manfaatkan untuk olah data yang bersifat dinamis, seperti meng-post ID table yang nantinya akan kita gunakan untuk meng-query data.

Selain itu, ada satu fitur yang saya sering gunakan yaitu grouping pada router. Dengan grouping ini saya bisa men-share atribute tertentu pada banyak router sekaligus. Contohnya tanpa grouping seperti ini :

Route::get('belajar/coba-satu/{parameter}', function($parameter){
    return 'Parameternya adalah '.$parameter;
});
Route::get('belajar/coba-dua/{parameter}', function($parameter){
    return 'Parameternya adalah '.$parameter;
});
Route::get('belajar/coba-tiga/{parameter}', function($parameter){
    return 'Parameternya adalah '.$parameter;
});
Route::get('belajar/coba-empat/{parameter}', function($parameter){
    return 'Parameternya adalah '.$parameter;
});
Route::get('belajar/coba-lima/{parameter}', function($parameter){
    return 'Parameternya adalah '.$parameter;
});

Sebernanya tidak ada yang salah code di atas, hanya saja terkesan berulang-ulang dan tidak efisien. Berikut ini contoh dengan grouping :

Route::group(['prefix' => 'belajar'], function() {
	Route::get('/coba-satu/{parameter}', function($parameter){
	    return 'Parameternya adalah '.$parameter;
	});
	Route::get('/coba-dua/{parameter}', function($parameter){
	    return 'Parameternya adalah '.$parameter;
	});
	Route::get('/coba-tiga/{parameter}', function($parameter){
	    return 'Parameternya adalah '.$parameter;
	});
	Route::get('/coba-empat/{parameter}', function($parameter){
	    return 'Parameternya adalah '.$parameter;
	});
	Route::get('/coba-lima/{parameter}', function($parameter){
	    return 'Parameternya adalah '.$parameter;
	});
});

Pada contoh di atas, kita mendefinisikan atribut prefix sebagai ‘belajar’, dimana semua router yang ada di dalam group memiliki satu kata yang sama pada segmen sebelumnya yaitu ‘belajar’. Maka kita tidak perlu mendifinisikan kata ‘belajar’ satu persatu pada router. Sebenarnya grouping ini juga akan efektif di gunakan dengan middleware, jadi kita cukup mendifinisikan satu middleware sehingga middleware tersebut akan diterapkan pada keseluruhan isi group. Untuk penjelasan apa itu middleware akan di bahas pada kesempatan berikutnya.

Ada lagi fitur yang saya rasa cukup memudahkan pekerjaan, yaitu route::resources. Dengan resources, kita cukup mendefinisikan satu router, yang nantinya akan secara otomatis meng-generate 7 method default yaitu index, create, store, show, edit, update, dan destroy. Contoh :

Route::resource('/transaksi', 'sg_transaksi');

Maka hasilnya seperti ini :

Untuk penjelasan yang lebih detail lagi bisa di baca pada dokumentasi laravel itu sendiri (https://laravel.com/docs/5.8/routing). Sekian pembahan kali ini semoga bisa bermanfaat. Terima Kasih

Laravel CRUD Ajax MySql

tutorial laravel

Pada artikel Laravel CRUD Ajax MySql kali ini, kita akan membahas cara membuat CRUD menggunakan Framework Laravel dengan metode Ajax. Tulisan ini merupakan kelanjutan dari artikel sebelumnya yaitu, (https://soft-gain.com/2019/07/21/crud-pada-laravel-mysql/). Dimana pada artikel Laravel CRUD Ajax MySql ini kita akan menggunakan Ajax yang mana setiap request yang dikirimkan akan di kerjakan secara asynchronous (tidak langsung).

AJAX itu sendiri adalah singkatan dari Asynchronous Javascript and XML, yang memungkinkan aplikasi web bekerja secara asynchronous (tidak langsung), memproses setiap request yang dikirim ke server di kerjakan dari sisi background.

Baiklah pertama-tama buat migration, model dan controller seperti gambar di bawah ini :

Untuk penjelasan migration bisa di lihat disini (https://soft-gain.com/2019/07/10/cara-dan-penjelasan-migration-pada-laravel/).

Source dari migration yang kita buat kurang lebih seperti ini :

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTableSgPegawai extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('sg_pegawai', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('nomor_induk_pegawai')->nullable();
            $table->string('nama')->nullable();
            $table->string('jabatan')->nullable();
            $table->string('alamat')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('sg_pegawai');
    }
}

Model nya seperti ini :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class sg_pegawai extends Model
{
    protected $table = 'sg_pegawai';

    protected $fillable = [
    	'nomor_induk_pegawai',
    	'nama',
    	'jabatan',
    	'alamat'
    ];
}

Controller nya seperti ini :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\sg_pegawai as model;

class sg_pegawai extends Controller
{
    public function index(){    	
    	return view('pegawai.table');
    }

    public function list(){    	
    	return model::all();
    }

    public function create(){
    	//
    }

    public function store(Request $request){
    	$result = model::create($request->all());

    	return $result;
    }

    public function show(){
    	//
    }

    public function edit($id){
    	$result = model::find($id);

    	return $result;
    }

    public function update(Request $request, $id){
    	$data = $request->except('_method', '_token');
    	model::where('id',$id)->update($data);

    	return 'sukses';
    }

    public function destroy($id){
    	model::destroy($id);

    	return 'sukses';
    }
}

Pada controller, jika biasanya return yang kita kirim adalah berupa view yang di sertai dengan variable, maka jika menggunakan ajax yang kita return adalah objek / baris data (umum nya berupa array atau json) yang nantinya akan kita parsing di view.

Tambahkan juga ini pada routes/web.php milik kita. Atau pada file routes.php jika menggunakan versi yang lebih lama dari versi saat saya membuat artikel ini (versi saya 5.8).

Route::get('/pegawai/list', 'sg_pegawai@list');
Route::get('/pegawai/destroy/{id}', 'sg_pegawai@destroy');
Route::resource('/pegawai', 'sg_pegawai');

Ini adalah source dari view yang akan kita buat :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table Pegawai</div>

                <div class="card-body">
                    <div class="table-responsive">
                        <a class="btn btn-primary" href="javascript:;" data-toggle="modal" data-target="#formPegawai">
                            Tambah Data
                        </a>
                        <p></p>
                        <table class="table table-hover table-striped table-bordered">
                            <thead>
                                <tr>
                                    <th class="text-center">Nomor Induk Pegawai</th>
                                    <th class="text-center">Nama</th>
                                    <th class="text-center">Jabatan</th>
                                    <th class="text-center">Alamat</th>
                                    <th class="text-center"> </th>
                                </tr>
                            </thead>
                            <tbody>
                                
                            </tbody>
                        </table>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>

<div id="formPegawai" class="modal fade" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title">Form Pegawai</h4>
                <button type="button" class="close" data-dismiss="modal">×</button>
            </div>
            <div class="modal-body">                    
                <div class="form-group col-xs-12 col-lg-12">
                    <label class="control-label">Nomor Induk Pegawai</label>
                    {{ Form::text('nomor_induk_pegawai', null, ['class' => 'form-control']) }}
                </div>
                <div class="form-group col-xs-12 col-lg-12">
                    <label class="control-label">Nama</label>
                    {{ Form::text('nama', null, ['class' => 'form-control']) }}
                </div>
                <div class="form-group col-xs-12 col-lg-12">
                    <label class="control-label">Jabatan</label>
                    {{ Form::text('jabatan', null, ['class' => 'form-control']) }}
                </div>
                <div class="form-group col-xs-12 col-lg-12">
                    <label class="control-label">Alamat</label>
                    {{ Form::text('alamat', null, ['class' => 'form-control']) }}
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-success" onclick="submit()">Save</button>
                <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
            </div>
        </div>
    </div>
</div>

<script type="text/javascript" src="{{ asset('js/jquery.min.js') }}"></script>
<script type="text/javascript">
    var idEdit = 0;

    $(document).ready(function(){        
        getIndex();
    });

    function getIndex(){
        $.ajax({
            type : 'get',
            url : 'http://localhost/belajar-laravel/public/pegawai/list',
            success : function(data){  
                $('tbody').html('');              
                $(data).each(function(x,y){
                    result = 
                    '<tr>'
                        + '<td>'+y.nomor_induk_pegawai+'</td>'
                        + '<td>'+y.nama+'</td>'
                        + '<td>'+y.jabatan+'</td>'
                        + '<td>'+y.alamat+'</td>'
                        + '<td>'
                            + '<a href="javascript:;" onclick="editPegawai('+y.id+')"><i class="fas fa-edit"></i></a>'
                            + '<a href="javascript:;" onclick="destroyPegawai(this.parentNode.parentNode, '+y.id+')"><i class="fas fa-trash-alt"></i></a>'
                        + '</td>'
                    + '</tr>';
                    $('tbody').append(result);
                });            
            },
        });
    }

    function submit(){
        var url;
        var type;
        var result;

        if( idEdit != 0 ){
            url = 'http://localhost/belajar-laravel/public/pegawai/'+idEdit;
            type = 'put';
        }else{
            url = 'http://localhost/belajar-laravel/public/pegawai';
            type = 'post';
        }

        $.ajax({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            },
            type : type,
            url : url,
            data : {
                nomor_induk_pegawai : $('[name=nomor_induk_pegawai]').val(),
                nama : $('[name=nama]').val(),
                jabatan : $('[name=jabatan]').val(),
                alamat : $('[name=alamat]').val(),
            },
            success : function(data){   
                idEdit = 0;   
                $('[name=nomor_induk_pegawai]').val('');
                $('[name=nama]').val('');
                $('[name=jabatan]').val('');
                $('[name=alamat]').val('');
                $('#formPegawai').modal('hide');
                getIndex();
            },
        });
    }

    function editPegawai(id){        
        $.ajax({
            type : 'get',
            url : 'http://localhost/belajar-laravel/public/pegawai/'+id+'/edit',
            success : function(data){
                idEdit = data.id;                
                $('#formPegawai').modal('show');
                $('[name=nomor_induk_pegawai]').val(data.nomor_induk_pegawai);
                $('[name=nama]').val(data.nama);
                $('[name=jabatan]').val(data.jabatan);
                $('[name=alamat]').val(data.alamat);                             
            },
        });
    }

    function destroyPegawai(element, id){        
        $.ajax({
            type : 'get',
            url : 'http://localhost/belajar-laravel/public/pegawai/destroy/'+id,
            success : function(data){
                if( data == 'sukses' ){
                    element.remove();
                }                                
            },
        });
    }
</script>
@endsection

Yang perlu diperhatikan dari view adalah javascript nya. Dimulai dari function getIndex(), ini adalah fungsi yang kita pakai saat tampilan awal / list table akan di tampilkan. Fungsi ini berisi ajax request dengan type get, untuk atribute url di sesuaikan dengan apa yang kita daftar kan juga pada web.php (http://root/pegawai/list, karena pegawai/list lah yang kita daftarkan sebagai router di web.php). Dalam atribute success, berisi event-event apa saja yang akan kita jalankan saat ajax yang kita kirim telah sukses di olah server dan di kembalikan pada user.

Fungsi submit(), berisi ajax yang akan kita gunakan untuk mengirim form inputan dari client ke server. Di sini kita menggunakan fungsi yang sama untuk create dan edit data, hanya di bedakan dari if statement yang di ambil berdasarkan variable idEdit. Atribute success juga berisi event yang di jalankan ketika data berhasil di kirim kan. Yang perlu menjadi catatan adalah pentingnya atribute headers, atribute ini berisi csrf_token yang harus selalu di sertakan setiap kita ingin menggunakan ajax dengan method post / put (alasan security). Untuk routernya, kita menggunakan default yang di buat kan oleh laravel jika kita menggunakan route::resources().

Fungsi editPegawai() berisi event yang kita gunakan ketika user mengklik button edit. Sedangkan fungsi destroyPegawai() berisi event yang kita gunakan untuk menghapus data dari database.

langkah terakhir, jalankan migration dengan perintah php artisan migrate. Dan berikut ini adalah contoh dari aplikasi yang sudah kita buat.

Form isian
List table

Source code utuhnya bisa agan ambil dari git saya (https://github.com/ImmanuelJL/belajar-laravel).

Aplikasi yang kita buat sudah bisa beroperasi secara
asynchronous menggunakan ajax, tanpa harus men-load seluruh halaman aplikasi kita sudah bisa bekerja secara dinamis dalam pengolahan datanya. Demikian, terima kasih.

Membuat relasi table laravel

tutorial laravel

Berikut ini adalah contoh sederhana cara membuat relasi table dengan menggunakan laravel. Karena sudah menggunakan konsep MVC, pembuatan relasi table dengan laravel bisa kita lakukan dengan cara membuat fungsi di dalam model yang nanti nya bisa kita panggil saat melakukan query dengan eloquent.

Untuk pembuatan relasi ini, kita akan melanjutkan dari aplikasi yang sudah kita buat sebelumnya (https://soft-gain.com/2019/07/21/crud-pada-laravel-mysql/). Pertama-tama kita akan menambahkan field baru pada table sg_barang, buat migration dan edit file nya menjadi seperti ini :

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class UpdateTableSgBarang23072019 extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('sg_barang',function($table){
            $table->bigInteger('updated_by')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('sg_barang',function($table){
            $table->dropColumn('updated_by');
        });
    }
}

Tidak ada yang terlalu aneh dengan pembuatan migration ini, namun jika ingin penjelasan lebih rinci bisa di lihat di sini (https://soft-gain.com/2019/07/10/cara-dan-penjelasan-migration-pada-laravel/).

Tambahkan juga field baru ini ke dalam model sg_barang yang sudah di buat sebelumnya. Juga kita akan membuat fungsi baru yaitu getUpdatedBy, fungsi ini lah yang akan merasikan table sg_barang dan table users. Setelah di edit kurang lebih akan menjadi seperti ini :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class sg_barang extends Model
{
    protected $table = 'sg_barang';

    protected $fillable = [
    	'nama_barang',
    	'jumlah_barang',
    	'keterangan',
    	'updated_by'
    ];

    public function getUpdatedBy(){
    	return $this->hasOne(User::class, 'id', 'updated_by');
        // return $this->hasOne(User::class, 'foreign_key', 'local_key');
    }
}

Kita menambahkan satu value baru pada variable fillabel yaitu updated_by. Yang terpenting adalah penambahan fungsi getUpdatedBy, di sini kita me-return object model itu sendiri dan menggukan fungsi hasOne. HasOne adalah fungsi yang kita pakai jika relasi nya adalah one to one, untuk one to many bisa memakai hasMany. Selain itu masih banyak lagi fungsi yang bisa kita pakai seperti belongsTo, belongsToMany dan lain-lain. Detailnya bisa di lihat di dokumentasinya (https://laravel.com/docs/5.8/eloquent-relationships)

Selanjutnya kita akan ubah sedikit controller kita, buka controller sg_barang.php dan tambahkan fungsi yang sudah kita buat di model pada query eloquent di fungsi index. Kurang lebih tampilan fungsi index kita akan menjadi seperti ini :

public function index(){
    	$barangs = model::with('getUpdatedBy')->get();

    	return view('barang.table',compact('barangs'));
}

Ada penambahan fungsi with() pada query di atas. Nah di dalam with inilah fungsi yang sudah kita buat di model sebelumnya kita panggil. Untuk pemanggilan banyak fungsi sekaligus bisa di lakukan dengan cara seperti ini with([‘A,’B’]).

Selanjutnya ubah sedikit pada file table.blade.php pada bagian table, tambahkan kolom baru yang nanti nya akan kita isi informasi nama user yang terakhir melakukan perubahan pada database. Kurang lebih seperti ini :

<table class="table table-hover table-striped table-bordered">
                            <thead>
                                <tr>
                                    <th class="text-center">Nama Barang</th>
                                    <th class="text-center">Jumlah Barang</th>
                                    <th class="text-center">Terakhir Ubah</th>
                                    <th class="text-center"> </th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($barangs as $barang)
                                    <tr>
                                        <td>{{ $barang->nama_barang }}</td>
                                        <td>{{ $barang->jumlah_barang }}</td>
                                        <td>{{ $barang->getUpdatedBy->name }}</td>
                                        <td>
                                            <a href="{{ URL::route('barang.edit',$barang->id) }}"><i class="fas fa-edit"></i></a>
                                            <a href="{{ url('barang/destroy/'.$barang->id) }}"><i class="fas fa-trash-alt"></i></a>
                                        </td>
                                    </tr>
                                @endforeach
                            </tbody>
                        </table>

Setelah menyertakan fungsi yang kita buat di dalam model ke dalam controller dengan menggukan fungsi with, fungsi getUpdatedBy bisa kita akses sebagai attribute di view. Contoh penggunannya adalah $barang->getUpdatedBy->name, pertama kita panggil dulu nama fungsi nya yaitu getUpdatedBy, lalu karena yang kita butuhkan adalah field name, maka yang kita panggil berikutnya adalah name, menjadi getUpdatedBy->name. Cara kerjanya adalah namaFungsi->namaFieldPadaDatabase.

Terakhir ubah sedikit pada form.blade.php, saya menambahkan hidden textbox yang berisi user id login user. Hidden textbox ini lah yang akan di post saat data di perbaharui oleh user.

{{ Form::hidden('updated_by', Auth::user()->id, ['class' => 'form-control']) }}

Ya demikian lah cara membuat relasi dengan laravel, sebetulnya selain dengan cara memanfaatkan model kita juga masih bisa membuat relasi dengan menggunakan perintah ::join() langsung pada query eloquent nya. Namun untuk kali ini saya lebih memfokuskan pemanfaatan model dari laravel itu sendiri. Mohon di koreksi bila ada kekeliruan. Terima Kasih.

Tutorial CRUD Laravel MySql, Contoh CRUD Pada Framework Laravel

tutorial laravel

Tutorial CRUD menggunakan Laravel dan MySql – Berikut ini adalah tutorial CRUD menggunakan Laravel dan MySql sebagai Database. CRUD sendiri adalah singkatan dari Create Read Update Delete, dengan menggunakan laravel CRUD menjadi lebih mudah karena pada dasarnya sudah ada fungsi-fungsi yang siap pakai jadi kita bisa lebih fokus pada logika bisnis nya.

Langsung saja, pertama-tama kita akan membuat table baru yaitu sg_barang dengan migration, selain file migration kita juga akan membuat model dan controller. Ubah file migration tadi menjadi seperti ini :

<?php
 use Illuminate\Support\Facades\Schema;
 use Illuminate\Database\Schema\Blueprint;
 use Illuminate\Database\Migrations\Migration;
 class CreateTableSgBarang extends Migration
 {
     /**
      * Run the migrations.
      *
      * @return void
      */
     public function up()
     {
         Schema::create('sg_barang', function (Blueprint $table) {
             $table->bigIncrements('id');
             $table->string('nama_barang')->nullable();
             $table->integer('jumlah_barang')->nullable();
             $table->text('keterangan')->nullable();
             $table->timestamps();
         });
     }
      
     public function down()
     {
          Schema::dropIfExists('sg_barang');
     }  
 }

Dan contoh saat membuat dan migrasi seperti ini :

Ubah file model menjadi seperti ini :

<?php
 namespace App;
 use Illuminate\Database\Eloquent\Model;
 class sg_barang extends Model
 {
     protected $table = 'sg_barang';
     protected $fillable = [
         'nama_barang',
         'jumlah_barang',
         'keterangan'
     ];
}

Ubah file controller menjadi seperti ini :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\sg_barang as model;

class sg_barang extends Controller
{
    public function index(){
    	$barangs = model::all();

    	return view('barang.table',compact('barangs'));
    }

    public function create(){
    	return view('barang.form');
    }

    public function store(Request $request){
    	model::create($request->all());

    	return redirect('barang');
    }

    public function show(){
    	//
    }

    public function edit($id){
    	$editForm = true;
    	$barangs = model::find($id);

    	return view('barang.form',compact('barangs','editForm'));
    }

    public function update(Request $request, $id){
    	$data = $request->except('_method', '_token');

    	model::where('id',$id)->update($data);

    	return redirect('barang');
    }

    public function destroy($id){
    	model::destroy($id);

    	return redirect('barang');
    }
}

Ubah juga file web.php / routes.php jika teman-teman menggunakan laravel dengan versi 5.2 ke bawah :

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
Route::resource('/barang', 'sg_barang'); 
Route::get('/barang/destroy/{id}', 'sg_barang@destroy');

Buat 2 buah view baru untuk bagian list dan form, di sini saya membuat folder baru (letaknya ada pada root\belajar-laravel\resources\views) dengan nama barang lalu saya buat file table.blade.php. Isi file nya seperti ini :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table Barang</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    <div class="table-responsive">
                        <a class="btn btn-primary" href="{{ url('barang/create') }}">
                            Tambah Data
                        </a>
                        <p></p>
                        <table class="table table-hover table-striped table-bordered">
                            <thead>
                                <tr>
                                    <th class="text-center">Nama Barang</th>
                                    <th class="text-center">Jumlah Barang</th>
                                    <th class="text-center"> </th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($barangs as $barang)
                                    <tr>
                                        <td>{{ $barang->nama_barang }}</td>
                                        <td>{{ $barang->jumlah_barang }}</td>
                                        <td>
                                            <a href="{{ URL::route('barang.edit',$barang->id) }}"><i class="fas fa-edit"></i></a>
                                            <a href="{{ url('barang/destroy/'.$barang->id) }}"><i class="fas fa-trash-alt"></i></a>
                                        </td>
                                    </tr>
                                @endforeach
                            </tbody>
                        </table>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Dan ini adalah file form.blade.php, yang akan jadi interface untuk form inputan :

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Table Barang</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    @if(isset($editForm))
                        {!! Form::model('', ['url' => url('/barang/'.$barangs->id), 'method' => 'put']) !!}
                    @else
                        {!! Form::model('', ['url' => url('/barang'), 'method' => 'post']) !!}
                    @endif
                        {{ csrf_field() }}
                        
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Nama Barang</label>
                            {{ Form::text('nama_barang', isset($barangs->nama_barang) ? $barangs->nama_barang : null, ['class' => 'form-control']) }}
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Jumlah Barang</label>
                            {{ Form::number('jumlah_barang', isset($barangs->jumlah_barang) ? $barangs->jumlah_barang : null, ['class' => 'form-control']) }}
                        </div>
                        <div class="form-group col-xs-12 col-lg-12">
                            <label class="control-label">Keterangan</label>
                            {{ Form::textarea('keterangan', isset($barangs->keterangan) ? $barangs->keterangan : null, ['class' => 'form-control']) }}
                        </div>

                        <button type="submit" class="btn btn-success">
                            Simpan
                        </button>
                    {!! Form::close() !!}

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Ini adalah tampilan list :

Dan ini tampilan form nya :

Berikut ini penjelasannya, pertama kita buat dahulu migration untuk detail apa itu migration bisa di lihat di sini (https://soft-gain.com/2019/07/10/cara-dan-penjelasan-migration-pada-laravel/). Controller, pada laravel karena kita menggunakan route dengan method resource maka secara otomatis kita bisa menggunakan 7 fungsi default yaitu index, create, store, show, edit, update, dan destroy.

Index biasa nya berisi logic untuk menampilkan data list atau data dalam bentuk table pada tampilan utama. Seperti yang bisa di lihat pada index kita menggunakan eloquent untuk mengambil data dan melempar nya pada view sebagai variabel.

public function index(){
    	$barangs = model::all(); // query eloquent

    	return view('barang.table',compact('barangs')); // memanggil view dan melempar variabel
    }

Create biasa nya hanya berisi return view. Return view ini di arahkan pada file view mana yang ingin kita tampilkan saat fungsi di akses.

public function create(){
    	return view('barang.form'); // view nya ada pada folder barang, file nya adalah form.blade.php
}

Store adalah fungsi yang akan kita pakai saat hendak menyimpan data ke dalam database. Didalam fungsi store biasanya kita sertakan satu argumen yaitu Request dan kita bungkus ke dalam variable $request, guna nya adalah untuk mengambil parameter yang di kirimkan dari form inputan. Lalu untuk return response nya adalah redirect. Redirect berisi argumen url dalam bentuk string, yang mana nantinya halaman akan di alihkan pada url tersebut.

public function store(Request $request){ // argumen request
    	model::create($request->all()); // query insert dengan elquent

    	return redirect('barang'); //  di alihkan ke halaman barang
}
// tambahan : 
// $request->all() berarti mengambil semua form inputan yang ada
// bisa juga mengambil berdasarkan name pada form input, contoh : 
// $request->nama_barang

Fungsi edit untuk membuka kembali form beserta dengan data yang akan kita ubah / edit.

public function edit($id){ // argumen id atau primary key
    	$editForm = true;
    	$barangs = model::find($id); // query eloquent, mencari data berdasarkan id table

    	return view('barang.form',compact('barangs','editForm')); // kembalikan hasil query pada tampilan
}

Fungsi update di gunakan untuk merubah data yang sudah ada pada database.

public function update(Request $request, $id){
    	$data = $request->except('_method', '_token');

    	model::where('id',$id)->update($data);

    	return redirect('barang');
}

Dan terakhir adalah fungsi destroy, untuk menghapus data pada database.

public function destroy($id){
    	model::destroy($id); // query eloquent hapus data berdasarkan primary key

    	return redirect('barang');
}

Demikian lah contoh sederhana penggunaan CRUD dengan laravel & mysql. Untuk contoh projeknya bisa di ambil dari git saya di link berikut ini (https://github.com/ImmanuelJL/belajar-laravel). Jika ada yang mau di tambahkan atau di koreksi bisa di sertakan di kolom komentar, terima kasih.

Tutorial Migration Laravel, Penjelasan Dan Cara Pakai Migration

tutorial laravel

Tutorial dan penjelasan migration pada laravel – Berikut ini saya akan membagikan sedikit dari apa yang saya tahu tentang migration pada laravel. Merujuk pada dokumentasinya itu sendiri, migration dapat di artikan sebagai versioning control untuk database (https://laravel.com/docs/5.8/migrations). Cara pakai migration itu sendiri sebetulnya tidak lah sulit, command yang biasa di gunakan pun singkat dan cenderung mudah di pahami. Di balik kemudahan memakai migration pada laravel ini, efek yang di rasakan akan sangat bermanfaat apa lagi ketika sedang bekerja secara tim. Tanpa perlu berlama-lama lagi, berikut ini artikel tentang tutorial dan penjelasan migration pada laravel.

Pengalaman saya sendiri merasa sangat terbantu dengan adanya migration ini, bayangkan ada 3 orang developer si A, si B dan si C yang mengerjakan projek yang sama. Sebelum saya tahu migration, ketika si A menambahkan satu field saja pada suatu table, maka ia harus memberitahukan pada si B dan si C perihal perubahan yang sudah dia buat. Bayangkan kalau projek itu dia buat dengan sembilan orang lainnya? si A harus memberi tahu mereka satu persatu belum lagi kalau ternyata salah satu dari mereka ada yang lupa menambahkan atau semacamnya… tentu hal ini akan membuat lambat proses pengembangan itu sendiri.

Nah disini lah kegunaan migration itu sendiri, jadi jika si A hendak membuat perubahan skema pada database, si A hanya tinggal membuka CMD dan ketikan perintah berikut :

php artisan make:migration nama_migration_yang_baru

note : ketikan perintah di atas pada CMD saat posisi sedang ada di root directory project

Setelah itu, laravel secara otomatis akan membuatkan satu file baru, file itu dapat di temukan dalam folder root\database\migrations atau dalam contoh saya ini di dalam C:\xampp\htdocs\belajar-laravel\database\migrations. Setelah di buka, di dalam file itu kita akan melihat dua fungsi kosong, yaitu UP dan DOWN. Yang perlu di pahami adalah, fungsi UP berisi statement yang akan di eksekusi saat menjalankan perintah php artisan migrate, sedangkan DOWN akan di eksekusi saat menjalankan perintah php artisan migrate:rollback.

Jadi sederhananya, php artisan migrate berisi statement perubahan yang ingin dilakukan, sedangkan migrate:rollback adalah kebalikannya. Contoh kita migrate untuk penambahan satu table, maka migrate:rollback berisi statement kebalikannya yaitu menghapus table tersebut. Mengapa perlu rollback untuk mengahpus table yang memang ingin di tambahkan? misal kita membuat satu table tetapi ternyata terdapat kesahalan dan hendak di revisi maka cara yang labih efisien adalah dengan meng-rollback migration tadi, kita revisi source code nya baru kita migrate sekali lagi.

Untuk contoh file migration itu sendiri kurang lebih seperti ini :

<?php 

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email',191)->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}

/**
Reverse the migrations.
*
@return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}

Sedikit penjelasan, Schema::create berarti membuat table baru. Dimana jika ingin merubah bisa dengan Schema::table, barulah argument pertama di isi dengan nama table, lalu buat anymous function di dalamnya berisi nama field dan type data apa yang ingin di pakai. Sedangkan pada function down berisi drop table. Untuk command yang lebih lengkap bisa dilihat pada dokumentasi laravel.

Kesimpulan :

Migration tentu akan sangat membantu projek yang di kerjakan secara tim. Si A tinggal buat migration lalu di share pada anggota tim yang lain, lalu yang lain tinggal jalan kan perintah migrate pada local dev masing-masing. Tentunya kalau proses share file migration di lakukan secara manual akan di rasa masih kurang efisien. Lain cerita nya jika tim tersebut sudah bekerja menggunakan GIT sebagai versioning control source code mereka. Si A tinggal push pada repo dan anggota yang lain pull lalu migrate. Penjelasan GIT dan bagaimana peng-aplikasiannya akan di bahas pada artikel lainnya. Terima Kasih.