AdityaDees: Laravel

Hot

https://publishers.chitika.com/

Contact us for advertising.
Showing posts with label Laravel. Show all posts
Showing posts with label Laravel. Show all posts

02 March 2022

Cara Membuat Controller Dengan Laravel

21:27 0
Sama halnya seperti Codeigniter, Laravel juga menerapkan sistem MVC (Model View Controller). Hal dasar yang perlu di pelajari untuk menggunakan Laravel adalah cara membuat controller.

Ada 2 cara yang bisa digunakan dalam membuat controller di laravel, pertama menggunakan terminal atau command line (di windows CMD), kedua dengan membuat langsung file controller secara manual.

Menggunakan Terminal, Commandline, atau CMD

Buka terminal atau cmd anda kemudian rahkan ke folder root project laravel yang sudah di buat. Ketikkan perintah php artisan make:controller DaftarController. "DaftarController" merupakan nama controller yang akan di buat.

Tunggu hingga pembuatan controller selesai kemudian buka app/Http/Controllers. Nanti akan muncul controller yang sudah di buat.

Membuat file langsung

Masuk ke app/Http/Controllers kemudian buat file baru dengan nama controller yang akan di buat misalnya DaftarController.php kemudian buka filenya dan isikan kode berikut :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;


class DaftarController extends Controller
{

}



Perbedaan membuat controller menggunakan cmd dan manual, pada manual anda harus menuliskan code dasar controller secara manual sedangkan ketika menggunakan cmd code dasar tersebut langsung tergenerate.
Read More

30 January 2022

Memasang Vue Router di Laravel

15:01 0
Memasang Vue Router di Laravel

Bismillah

Melanjutkan postingan sebelumnya mengenai Setup Vue Js di Laravel dalam Satu Project. Dipostingan tersebut kita telah berhasil melakukan konfigurasi awal vue agar bisa bundling dengan project laravel. Nah selanjutnya adalah kita akan menerapkan vue router di project tersebut. Vue router adalah merupakan library dari vue yang khususnya untuk melakukan routing agar aplikasi bisa berjalan layaknya Single Page Application pada umumnya.

Untuk menambahkan router di vue, masukkan perintah di terminal atau command prompt anda dengan perintah :
npm install vue-router
Tunggu hingga proses selesai.

Untuk mempermudah penerapan penggunaan vue router tersebut, kita akan membuat dua buah page/halaman. Halaman pertama adalah halaman dashboard, dan yang satunya lagi adalah halaman profile. Berikut adalah langkah-langkahnya :
  1. Buat dua buah file dengan nama Dashboard.vue dan Profile.vue di direktori `resources\js\componenents`.
  2. Pada masing-masing halaman tersebut buat template vue sederhana. Sebagai contoh :
  3. Dashboard.vue
    <template>
        <h3>Hai, Ini adalah halaman dashboard</h3>
    </template>

    <script>
        export default {
            name:'dashboard'
        }
    </script>

    Profile.vue
    <template>
        <h3>Hai ini adalah halaman profile</h3>
    </template>

    <script>
        export default {
            name:'profile'
        }
    </script>
  4. Kemudian setelah membuat kedua file diatas, buat lagi sebuah file dengan nama Navigation.vue. Di file inilah link/routing akan ditampilkan. Berikut adalah isi dari file Navigation.vue :
  5. <template>
        <div>
            <router-link to="/dashboard">Dashboard</router-link> |
            <router-link to="/profile">Profile</router-link>
        </div>
    </template>

    <script>
        export default{
            name:'navigation'
        }
    </script>
    Seperti terlihat diatas, ada component bernama router-link. Dimana di component inilah kita meletakkan link dari page yang sebelumnya yang sudah dibuat menggunakan props to.
  6. Edit file App.vue menjadi seperti berikut :
  7. <template>
        <div class='container'>
            <Navigation />
            <router-view ></router-view>
        </div>
    </template>

    <script>
    import Navigation from './Navigation.vue'

    export default {
        components : {Navigation}
    }
    </script>
  8. Kemudian edit kembali file app.js, menjadi seperti dibawah ini :
  9. import App from './components/App'
    import { createApp } from 'vue'
    import { createRouter, createWebHistory } from 'vue-router'
    import Dashboard from './components/Dashboard.vue'
    import Profile from './components/Profile.vue'

    const router = createRouter({
      history: createWebHistory(),
      routes: [
        {
          path: '/dashboard',
          component: Dashboard,
          name: 'dashboard',
          meta: {
              title: 'Dashboard'
          },
        },
        {
          path: '/profile',
          component: Profile,
          name: 'profile',
          meta: {
              title: 'Profile'
          },
        },
      ],
    });

    const app = createApp({
        components: {
            App
          }
    });

    app.use(router)
    app.mount('#app');
    Penjelasan :
    • Yang diperlukan untuk membuat router adalah dengan meng-import beberapa method dari vue-router yaitu createRouter dan createWebHistory.
    • Didalam method createRouter, tambahkan parameter history dan routes.
    • Pada parameter history isinya adalah createWebHistory yang mana parameter history ini gunanya adalah agar history dari url dibrowser yang dibuat bisa dibaca oleh vue-router dan di render sebagai SPA.
    • Dibagian parameter routes, disini kita daftarkan seluruh routes yang diperlukan. Sebagai contoh, disini kita memerlukan routing untuk halaman Dashboard dan Profile. Yang perlu diperhatikan pada saat membuat routes adalah di parameter path, component, dan name. Dimana parameter path berisi url path yang merujuk ke component tertentu. Kemudian component merupakan komponen apa yang akan ditampilkan/dirender pada saat berada di path tadi, dan name adalah merupakan nama routes itu sendiri.
  10. Sampai disini routing di vue sudah selesai dibuat. Dan pada saat dijalankan maka tampilannya adalah seperti dibawah ini :
  11. Simple vue router laravel
    Saat di klik salah satu link/url maka akan membuka page tersebut tanpa harus mereload keseluruhan halaman seperti dibawah ini :
    Simple vue router laravel
  12. Terakhir agar tidak muncul pesan Not Found dilaravel pada saat mereload page penuh, maka perlu diubah routing laravel di `routes\web.php` menjadi seperti berikut :
  13. <?php

    use Illuminate\Support\Facades\Route;

    /*
    |--------------------------------------------------------------------------
    | 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('/{any}', function () {
        return view('welcome');
    })->where('any','.*');

Demikian tutorial lanjutan mengenai Memasang Vue Router di Laravel

Read More

31 December 2021

Ask Setup Vue Js di Laravel dalam Satu Project AdityaDees

21:39 0
Langkah-Langkah Setup Vue Js di Laravel dalam 1 Project
Bismillah

Sebagai seorang fullstack developer, terkadang kita merasa kurang nyaman ketika develop sebuah aplikasi yang memiliki dua buah project yang berbeda. Dimana satu project sebagai backend dan satu-nya lagi sebagai frontend.

Sebelum munculnya berbagai framework dan library untuk frontend seperti vue, react, angular dll, biasanya seorang fullstack developer hanya bekerja disatu project saja. Biasanya untuk urusan tampilan, framework yang memakai konsep MVC (Model View Controller) maka letaknya adalah di bagian direktori view. Sebagai contoh, untuk laravel sendiri yang memakai konsep MVC, maka pengaturan tampilan berada di bagian resources/views secara default. Namun setelah kemunculan framework ataupun library frontend tadi, maka untuk frontend biasanya memiliki project tersendiri yang sudah bundling didalamnya node modules.

Dari permasalahan diatas agar proses develop menjadi mudah untuk seorang fullstack, maka solusinya adalah menyatukan backend dan frontend didalam sebuah project. Untuk laravel sendiri, ada sebuah node modules yang berfungsi untuk menyatukan Vue js ataupun library lainnya kedalam project laravel yakni laravel-mix. Mungkin di framework php lain seperti Codeigniter, Yii dan yang lainnya juga memiliki cara tersendiri untuk melakukan hal tersebut.

Baiklah, sebelum melakukan melakukan setup penggabungan library Vue dengan Laravel. Beberapa tools yang harus terinstal di laptop atau pc anda adalah node js dan composer. Jika belum terinstal, maka lakukan proses penginstalan keduanya terlebih dahulu.

Disini saya akan mencontohkan setup mulai dari awal yang dimulai dari pembuatan project laravel terlebih dahulu. Langkah-langkahnya adalah seperti berikut ini :
  • Buka terminal/command line, kemudian buat sebuah project laravel baru dengan cara memasukkan perintah berikut :
  • composer create-project laravel/laravel nama-project-anda
    Disini saya menggunakan composer untuk membuat project laravel. Selain menggunakan composer ada cara lain yang bisa anda lihat langsung di website resminya di https://laravel.com/docs/8.x/installation.
  • Setelah selesai, buka editor favorit anda kemudian tambahkan project yang sudah anda buat tadi kedalam editor tersebut.
  • Edit file package.json dibagian devDependencies, ubah menjadi seperti dibawah ini :
  •    "devDependencies": {
            "laravel-mix": "^6.0.6",
            "axios": "^0.21",
            "lodash": "^4.17.19",
            "postcss": "^8.1.14",
            "vue": "^3.2.26",
            "vue-loader": "^16.8.3",
            "vue-template-compiler": "^2.6.14",
            "vue-router": "^4.0.12"
        }
    Dibagian ini kita memasukkan modules yang dibutuhkan yakni vue, vue-loader, vue-template-compiler dan vue-router.
  • Setelah selesai, di terminal/command line masukkan perintah :
  • npm install
  • Kemudian masukkan lagi perintah dibawah ini :
  • npm run watch
    Perintah diatas gunanya adalah untuk melakukan compile script vue secara otomatis jika ada perubahan pada source code vue yang kita buat. Pastikan proses ini berhasil dan tidak terjadi error.
  • Selanjutnya jika sudah berhasil, buat sebuah direktori baru dengan nama `components` didirektori `resources/js`. Didalam direktori `components` tadi buat sebuah file dengan nama `App.vue`. Selanjutnya isi file tersebut dengan source code sederhana seperti dibawah ini :
  • <template>
        <div class='container'>
            <h1>Selamat Datang</h1>
        </div>
    </template>
  • Setelah itu edit file wellcome.blade.php yang berada didirektori resources/views/wellcome.blade.php sehingga menjadi seperti dibawah ini :
  • <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <title>Laravel | Vue js</title>
            <link href="{{ mix('/css/app.css') }}" rel="stylesheet"/>
        </head>
        <body>
            <div id="app">
                <App/>
            </div>
            <script src="{{ mix('js/app.js') }}"></script>
        </body>
    </html>
  • Kembali ke terminal anda, jalankan server local laravel dengan perintah :
  • php artisan serve
  • Buka browser, kemudian masuk ke url local laravel tadi di http://localhost:8000. Jika berhasil, maka akan muncul halaman index-nya seperti gambar dibawah ini :
  • Localhost laravel with vue frontend
Sampai disini kita sudah berhasil menggabungkan laravel dengan vue js. Di tutorial selanjutnya insyaAllah kita akan membahas bagaimana supaya request dari browser client bisa dibaca oleh router vue js. Jika ada pertanyaan mengenai postingan Setup Vue Js di Laravel dalam Satu Project silahkan ditanyakan dikolom komentar.
Read More

13 December 2021

Ask Cara Deploy Laravel, Codeigniter dan Framework PHP Lainnya di Docker AdityaDees

22:48 0
Cara Deploy Laravel, Codeigniter dan Framework PHP Lainnya di Docker
Bismillah…
Beberapa tahun belakangan kita tentu sering mendengar istilah docker dan kontainerisasi. Nah pada tulisan saya kali ini kita akan langsung mempraktekkan bagaimana cara men-deploy atau memasang website yang sebelumnya sudah kita buat kedalam sebuah container. Sebelum memulai, ada baiknya kita mengerti terlebih dahulu apa itu container dan apa itu docker.
  • Container
  • Container yang dimaksud disini merupakan wadah yang digunakan untuk menempatkan seluruh kebutuhan aplikasi baik itu web server, database ataupun kebutuhan lainnya yang dibutuhkan oleh aplikasi kita tadi supaya bisa berjalan layaknya di komputer lokal.

  • Docker
  • Docker merupakan salah satu platform yang bisa digunakan sebagai container/wadah untuk menempatkan seluruh kebutuhan software yang kita butuhkan. Docker seperti halnya sebuah VM yang berjalan di mesin virtual, hanya saja docker lebih ringan daripada VM yang membutuhkan resource lebih besar daripada docker.

    Dengan menggunakan docker, kita bebas memilih versi bahasa pemrograman, database, library dan software lainnya tanpa khawatir terjadi bentrok antara 1 aplikasi dengan aplikasi lainnya, karena docker bersifat isolate dimana konfigurasi sebuah project anda tidak akan mengganggu konfigurasi dan kebutuhan project yang lain.

    Misalnya saya memiliki 2 buah project, dimana project 1 menggunakan php versi 7.4 sedangkan project kedua menggunakan php versi 8.0 maka antara 2 project tersebut tidak mungkin terjadi bentok karena masing-masing project sudah memiliki container dan konfigurasi terisolasi masing-masing.

Nah, setelah mengetahui pengertian diatas, sekarang kita akan memulai untuk proses deploy. Disini saya akan men-deploy sebuah project aplikasi web dengan bahasa pemrograman php dimana aplikasi ini menggunakan nginx sebagai web server dan MySQL sebagai database. Kita akan lakukan konfigurasi di file tersendiri untuk masing-masing tools tersebut. Untuk php dan nginx disini saya menggunakan varian alpine linux, karena image docker dari alpine ini paling ringan dan paling kecil untuk ukuran filenya dibandingkan dengan image lainnya.

Berikut adalah langkah-langkah untuk melakukan deploy website ke docker :
  1. Didalam project website anda, buat sebuah direktori/folder bernama docker-config kemudian tambahkan lagi didalamnya direktori mysql, nginx dan php seperti berikut ini:
  2. Deploy php ke docker
  3. Didalam direktori mysql, buat sebuah direktori baru dengan nama db. Kemudian tempatkan di dalam direktori db ini database dari website yang anda buat sebelumnya.
  4. Selanjutnya beralih ke direktori nginx, buat sebuah file docker dengan nama web.dockerfile. Kemudian masukkan konfigurasi seperti dibawah ini didalam file tersebut :
  5. FROM nginx:1.21.4-alpine

    ADD ./docker-config/nginx/vhost.conf /etc/nginx/conf.d/default.conf
  6. Masih di direktori yang sama, tambahkan lagi sebuah file vhost.conf, dimana file ini berisi konfigurasi untuk nginx.
  7. server {
    listen 80;
    index index.php index.html;
    root /var/www/public/public;

    location / {
    try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    }
  8. Beralih ke direktori php yang sudah dibuat sebelumnya, buat sebuah file php.dockerfile, lalu masukkan konfigurasi seperti dibawah ini :
  9. FROM php:8.0.5-fpm-alpine

    RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql
  10. Selanjutnya kembali ke direktori awal project. Lalu buat sebuah file docker-compose.yml. Didalam file inilah kita akan mendeklarasikan seluruh kebutuhan guna menjalankan website kita tadi.
  11. version: '3'
    services:
    web:
    build:
    context: ./
    dockerfile: ./docker-config/nginx/web.dockerfile
    container_name: inventory-webserver
    volumes:
    - ./:/var/www/public
    ports:
    - "8080:80"
    networks:
    - app-network

    app:
    build:
    context: ./
    dockerfile: ./docker-config/php/php.dockerfile
    container_name: inventory
    volumes:
    - ./:/var/www/public
    networks:
    - app-network
    links:
    - database
    depends_on:
    - database

    database:
    image: mariadb
    container_name: inventory_database
    restart: unless-stopped
    tty: true
    ports:
    - "3307:3306"
    environment:
    MYSQL_DATABASE: inventory_sample
    MYSQL_ROOT_PASSWORD: 12345
    SERVICE_NAME: mysql
    SERVICE_TAGS: dev
    volumes:
    - dbdata:/var/lib/mysql/
    - ./docker-config/mysql/db:/docker-entrypoint-initdb.d
    networks:
    - app-network

    networks:
    app-network:
    driver: bridge
    volumes:
    dbdata:
    driver: local
  12. Setelah seluruh file tersebut dibuat, jalankan docker-compose di terminal/command line anda dengan perintah :
  13. docker-compose up
  14. Tunggu hingga proses selesai, dan jalankan website anda di http://localhost:8080
Demikianlah tutorial cara deploy laravel, codeigniter dan framework PHP lainnya di docker. 
Read More

15 September 2021

Ask Cara install npm di Laravel AdityaDees

15:57 0

Laravel adalah sebuah framework untuk webapp yang berbasis php, sedangkan npm adalah sebuah package manager untuk node.js atau secara umum javascript. Laravel dan npm tidak saling bergantung, artinya Laravel dapat digunakan tanpa npm dan sebaliknya. Akan tetapi, Laravel memberikan kemudahan untuk para penggunanya agar dapat menggunakan javascript dan css untuk membangun UI. Salah satunya dengan menyediakan scaffolding untuk Vue, React dan Bootstrap melalui laravel/ui.

Jika Anda menggunakan laravel/ui untuk membangun UI, maka tentu saja Anda membutuhkan npm dan tentu saja npm membutuhkan node.js. Oleh karena itu, berikut ini adalah langkah-langkah untuk menginstall npm dan menambahkan package di Laravel.

0. Menginstall node.js

Seperti disebutkan di atas, bahwa npm memerlukan node.js dan bahkan jika Anda menginstall node.js, maka secara otomatis akan terinstall npm juga. Oleh karena itu langkah pertama adalah silahkan install node.js terlebih dahulu dengan cara mengunduh di sini : https://nodejs.org

Node.js sudah tersedia untuk Windows, Linux dan MacOS, maka silahkan pilih node.js yang sesuai dengan sistem operasi Anda. Untuk versi, sangat disarankan untuk memilih versi yang LTS (Long Term Support), dikarenakan versi ini adalah versi yang paling stabil dan akan mendapatkan support jangka panjang (30 bulan).

Anda dapat melihat versi node.js dan npm yang terinstall dengan menggunkan perintah :

node --version
npm --version

versi node.js dan npm

Baca juga :
Apakah Node.js, npm dan bagaimana menginstallnya
1. Menginstall dan menambahkan package yang diperlukan

Untuk menginstall package npm yang sudah ditambahkan di dalam project laravel Anda, jalankan perintah : npm install. Dengan perintah ini, npm akan menginstall semua package beserta dependensinya dari file package.json.

npm install

Untuk menambahkan package yang Anda inginkan, silahkan masuk ke dalam folder project laravel Anda, kemudian jalankan perintah npm install nama_package . Contoh :

npm install vuetify
npm install

2. Compile Javascript dan CSS

Untuk mengcompile javascript dan css tersebut diatas, silahkan jalankan perintah :

npm run dev
Perintah di atas akan mengcompile semua javascript dan css yang digunakan menjadi bundle yang ramah debug. Artinya jika terjadi kesalahan, akan terlihat jelas di console.
npm run dev
Atau jika Anda ingin agar setiap perubahan yang Anda lakukan pada script atau css otomatis dicompile ulang, maka gunakan perintah :
npm run watch
Dan jika Anda sudah selesai melakukan pengembangan dan ingin mendeploy aplikasi Anda, maka jalankan perintah di bawah ini untuk mengcompile javascript dan css dalam mode production. Dalam mode ini, proses compile akan menjadi lebih lama dan hasil akhirnya tidak ramah debug tetapi ukuran file menjadi jauh lebih kecil.
npm run production

Sekian artikel tentang cara menambah dan menginstall package npm ke dalam Laravel. Selamat mencoba dan semoga yang sedikit ini bermanfaat.

Read More

18 July 2021

Ask Menjalankan Cron Job Laravel di Docker Container AdityaDees

21:50 0

menjalankan cron job di docker container - Cron Job adalah program yang memungkinkan kita dapat menjalankan perintah secara otomatis dan terjadwal. Di Laravel sendiri, terdapat layanan Task Schedule yang dapat dihubungkan dengan cron job di server. Berikut ini adalah trik untuk menjalankan cron job di dalam docker container.

1. Buat Schedule.

Saya akan membuat schedule sederhana, yang mana setiap 1 menit sekali, saya akan me-request endpoint API getUser menggunakan curl.

app/Console/Kernel.php

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/

protected $commands = [
//
];

/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/

protected function schedule(Schedule $schedule)
{
$schedule->exec('curl -s http://localhost:8000/api/getUser')->everyMinute();
}

/**
* Register the commands for the application.
*
* @return void
*/

protected function commands()
{
$this->load(__DIR__.'/Commands');

require base_path('routes/console.php');
}
}


2. Buat file bernama crontab (untuk di-copy ke container).

/crontab

* * * * * (lokasi php) (lokasi file artisan) schedule:run >> /var/log/cron.log 2>&1
# line kosong, jangan dihapus

contoh:

/crontab
* * * * * /usr/local/bin/php /var/www/artisan schedule:run >> /var/log/cron.log 2>&1
# line kosong, jangan dihapus


3. Edit Dockerfile.

Pada file Dockerfile, sisipkan perintah berikut ini untuk apply cron job yang sudah dibuat.

/Dockerfile

# install cron dan crontab
RUN apt install cron

# copy file crontab ke direktori cron.d
COPY crontab /etc/cron.d/crontab

# masuk sebagai root
USER root

# beri akses eksekusi crontab
RUN chmod 0644 /etc/cron.d/crontab

# apply cron job
RUN crontab /etc/cron.d/crontab

# buat log file
RUN touch /var/log/cron.log

# jalankan command cron ketika container sudah berjalan
CMD cron && tail -f /var/log/cron.log

Setelah semua selesai, cron sudah berjalan ketika container dijalankan. Server akan menjalankan perintah sesuai dengan Laravel Schedule. Untuk melihat log cron job yang sedang berjalan, silahkan akses /var/log/cron.log di container. Bisa dengan docker / docker-compose exec.

Oke sekian artikel kali ini tentang cara menjalankan cron job laravel task scheduling di docker, semoga bermanfaat. Terima kasih!

Read More

05 June 2021

Ask Memahami Eloquent Relasi Data di Laravel AdityaDees

15:12 0

memahami relasi database di laravel - Di framework laravel terdapat eloquent yang merupakan fitur untuk mengakses dan memanipulasi data secara lebih singkat dan lebih cepat dibandingkan menggunakan raw bahasa SQL.

Jika kita membuat model untuk table SQL, maka eloquent sudah bisa dipakai secara langsung dengan memanggil class model tersebut. Eloquent bekerja secara ORM (object-relational mapper) yang berjalan dengan memanggil model, kemudian mengkonversi urutan fungsi yang dipanggil ke bahasa SQL. Nah, SQL tersebut yang mengakses dan memanipulasi database.

Jadi kesimpulannya, eloquent hanya sebagai pengonversi function pada class model (php) ke bahasa sql. Berikut ini adalah flow nya.


Adanya eloquent juga sangat memudahkan developer untuk melakukan relasi data. Ini yang akan saya bahas di artikel kali ini. Saya akan coba jelaskan dengan cara mudah dan dengan contoh yang sederhana.

A. Persiapan Data

Kita akan membuat database untuk aplikasi pembelian makanan di restoran dengan relasi data sebagai berikut.


Kita akan membuat 4 table yaitu:
  • restaurants
    Table ini akan berisi data restoran yang ada.

  • menus
    Table ini akan berisi data menu (hidangan) yang ada di restoran.

  • users
    Table ini akan berisi data user/pelanggan yang bisa melakukan pembelian.

  • purchases
    Table ini akan mencatat pembayaran user dan menu yang dipilih.

1. database/migrations/2021_05_31_154128_restaurants.php
<?php

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

class Restaurants extends Migration
{
/**
* Run the migrations.
*
* @return void
*/

public function up()
{
Schema::create('restaurants', function (Blueprint $table) {
$table->id();
$table->string("name");
$table->string("location");
$table->string("balance");
$table->text("business_hours")->nullable();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/

public function down()
{
Schema::dropIfExists('restaurants');
}
}

2. database/migrations/2021_05_31_154315_menus.php
<?php

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

class Menus extends Migration
{
/**
* Run the migrations.
*
* @return void
*/

public function up()
{
Schema::create('menus', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('restaurant_id');
$table->string('name');
$table->decimal('price');
$table->timestamps();

$table->foreign('restaurant_id')->references('id')->on('restaurants')->onDelete('cascade');
});
}

/**
* Reverse the migrations.
*
* @return void
*/

public function down()
{
Schema::dropIfExists('menus');
}
}

3. database/migrations/2021_05_31_154723_users.php
<?php

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

class Users extends Migration
{
/**
* Run the migrations.
*
* @return void
*/

public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string("name");
$table->string("location");
$table->decimal("balance");
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/

public function down()
{
Schema::dropIfExists('users');
}
}

4. database/migrations/2021_05_31_154811_purchases.php
<?php

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

class Purchases extends Migration
{
/**
* Run the migrations.
*
* @return void
*/

public function up()
{
Schema::create('purchases', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('menu_id');
$table->dateTime('date');
$table->timestamps();

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('menu_id')->references('id')->on('menus')->onDelete('cascade');
});
}

/**
* Reverse the migrations.
*
* @return void
*/

public function down()
{
Schema::dropIfExists('purchases');
}
}

Flow dari aplikasi ini nantinya adalah, purchases akan mencatat data pembayaran users dan menus milik sebuah restaurants.


Setelah struktur data selesai, jalankan php artisan migrate dan coba isi beberapa data contoh sesuai dengan aturan relasi yang sudah dibuat.

B. Relasi Data

1. One to Many

Sebuah restoran pasti memiliki banyak menu. Disini, kita bisa terapkan relasi one-to-many dengan me-return data seluruh restoran beserta menu nya.


App\Restaurant.php (model)
public function menus() {
return $this->hasMany('App\Menu');
}

App\Http\Controller\RestaurantController (controller)
return Restaurant::with('menus')->get();
 
Result:
[
{
"id": 1,
"name": "Orange House",
"location": "-8.65504,115.110801",
"balance": "4483.84",
"business_hours": "Sunday: 10:45 AM - 5 PM | Monday, Friday: 2:30 PM - 8 PM | Tuesday: 11 AM - 2 PM | Wednesday: 1:15 PM - 3:15 AM | Thursday: 10 AM - 3:15 AM | Saturday: 5 AM - 11:30 AM",
"menus": [
{
"id": 1,
"restaurant_id": 1,
"name": "Kiwiberries",
"price": "10.64"
},
{
"id": 2,
"restaurant_id": 1,
"name": "Dates",
"price": "12.45"
}
]
}
]

2. Many to One

Setiap record pembelian (purchases), pasti menyimpan data pembeli (users) dan menu yang dipilih (menus). Purchases bertindak sebagai table "many" yang menyimpan "one" data users dan "one" data menu.



App\Purchase.php (model)

public function menu() {
return $this->belongsTo('App\Menu');
}

public
function user() {
return $this->belongsTo('App\User');
}
App\Http\Controller\PurchaseController (controller)
return Purchase::with('menu', 'user')->get();

Result:

[
{
"id": 1,
"user_id": 1,
"menu_id": 13271,
"date": "2020-02-10 04:09:00",
"user": {
"id": 1,
"name": "Don Reichert",
"location": "-8.640233,115.228221",
"balance": "700.70"
},
"menu": {
"id": 13271,
"restaurant_id": 1561,
"name": "Dos Equis Light Hybrid Beer",
"price": "13.18"
}
},
{
"id": 2,
"user_id": 1,
"menu_id": 10679,
"date": "2020-04-03 13:56:00",
"user": {
"id": 1,
"name": "Don Reichert",
"location": "-8.640233,115.228221",
"balance": "700.70"
},
"menu": {
"id": 10679,
"restaurant_id": 1256,
"name": "Coconut Key Lime Pie with Toffee Bits",
"price": "12.81"
}
},
{
"id": 3,
"user_id": 1,
"menu_id": 11466,
"date": "2020-02-29 00:13:00",
"user": {
"id": 1,
"name": "Don Reichert",
"location": "-8.640233,115.228221",
"balance": "700.70"
},
"menu": {
"id": 11466,
"restaurant_id": 1347,
"name": "Delirium Pilsner",
"price": "11.22"
}
},
{
"id": 4,
"user_id": 1,
"menu_id": 9168,
"date": "2018-05-13 18:02:00",
"user": {
"id": 1,
"name": "Don Reichert",
"location": "-8.640233,115.228221",
"balance": "700.70"
},
"menu": {
"id": 9168,
"restaurant_id": 1087,
"name": "Patagonia Stout",
"price": "13.03"
}
},
{
"id": 5,
"user_id": 1,
"menu_id": 15372,
"date": "2018-11-16 06:49:00",
"user": {
"id": 1,
"name": "Don Reichert",
"location": "-8.640233,115.228221",
"balance": "700.70"
},
"menu": {
"id": 15372,
"restaurant_id": 1811,
"name": "Neapolitan Brownie with Marshmallows",
"price": "12.46"
}
}
]


3. Has Many Through

Ini adalah fungsi eloquent untuk menampilkan data dengan relasi lebih dari 2 tabel. Misalnya ketika kita ingin menampilkan restaurants beserta data purchases.


Result:

[
{
"id": 1,
"name": "Orange House",
"location": "-8.65504,115.110801",
"balance": "4483.84",
"business_hours": "Sunday: 10:45 AM - 5 PM | Monday, Friday: 2:30 PM - 8 PM | Tuesday: 11 AM - 2 PM | Wednesday: 1:15 PM - 3:15 AM | Thursday: 10 AM - 3:15 AM | Saturday: 5 AM - 11:30 AM",
"transactions": [
{
"id": 1412,
"user_id": 160,
"menu_id": 2,
"date": "2020-05-23 08:39:00"
},
{
"id": 6391,
"user_id": 688,
"menu_id": 2,
"date": "2018-11-26 20:44:00"
},
{
"id": 1329,
"user_id": 151,
"menu_id": 4,
"date": "2019-04-07 11:47:00"
},
{
"id": 5248,
"user_id": 560,
"menu_id": 5,
"date": "2018-06-30 16:05:00"
},
{
"id": 7930,
"user_id": 848,
"menu_id": 5,
"date": "2020-01-11 13:27:00"
},
{
"id": 7148,
"user_id": 766,
"menu_id": 10,
"date": "2018-03-20 09:22:00"
}
]
},
{
"id": 2,
"name": "34 Grill & Tap",
"location": "-8.679412,115.136036",
"balance": "4882.81",
"business_hours": "Sun, Fri: 6 AM - 9 PM | Mon, Weds: 11:45 AM - 4:45 PM | Tues: 7:45 AM - 2 AM | Thurs: 5:45 PM - 12 AM | Sat: 10:15 AM - 9 PM",
"transactions": [
{
"id": 498,
"user_id": 53,
"menu_id": 19,
"date": "2019-01-17 18:47:00"
},
{
"id": 7928,
"user_id": 848,
"menu_id": 19,
"date": "2019-08-26 00:54:00"
},
{
"id": 6636,
"user_id": 714,
"menu_id": 20,
"date": "2020-01-18 03:39:00"
},
{
"id": 5721,
"user_id": 617,
"menu_id": 23,
"date": "2018-05-17 03:21:00"
}
]
}
]


C. Conditional Rendering

1. With-Where

Fungsi ini digunakan untuk merender tabel kiri dan tabel kanan. Namun untuk tabel kanan hanya akan tampil sesuai syarat kondisional (tidak mempengaruhi tabel kiri).

App\Http\Controller\RestaurantController (controller)

return Restaurant::with([
'menus' => function ($q) {
$q->where('id', '=', 1); // id menu
}
])->get();

Result:

(hanya menampilkan menu sesuai syarat kondisi)

[
{
"id": 1,
"name": "Orange House",
"location": "-8.65504,115.110801",
"balance": "4483.84",
"business_hours": "Sunday: 10:45 AM - 5 PM | Monday, Friday: 2:30 PM - 8 PM | Tuesday: 11 AM - 2 PM | Wednesday: 1:15 PM - 3:15 AM | Thursday: 10 AM - 3:15 AM | Saturday: 5 AM - 11:30 AM",
"menus": [
{
"id": 1,
"restaurant_id": 1,
"name": "Kiwiberries",
"price": "10.64"
}
]
},
{
"id": 2,
"name": "34 Grill & Tap",
"location": "-8.679412,115.136036",
"balance": "4882.81",
"business_hours": "Sun, Fri: 6 AM - 9 PM | Mon, Weds: 11:45 AM - 4:45 PM | Tues: 7:45 AM - 2 AM | Thurs: 5:45 PM - 12 AM | Sat: 10:15 AM - 9 PM",
"menus": []
},
{
"id": 3,
"name": "76 King",
"location": "-8.832813,115.130664",
"balance": "1320.19",
"business_hours": "Sunday: 2 PM - 7 PM | Monday, Wednesday: 3:45 PM - 5 PM | Tuesday: 11:30 AM - 3 AM | Thursday: 10 AM - 11:30 PM | Friday: 7 AM - 9:45 AM | Saturday: 12:45 PM - 1:15 PM",
"menus": []
},
{
"id": 4,
"name": "Sweet Steakhouse",
"location": "-8.598099,115.167311",
"balance": "4629.91",
"business_hours": "Sun: 1:15 PM - 12:30 AM | Mon: 5:30 AM - 6 PM | Tue: 10 AM - 12:15 AM | Wed: 1:45 PM - 4:45 PM | Thu: 7:15 AM - 3:45 AM | Fri: 1:30 PM - 12:45 AM | Sat: 7 AM - 11:45 AM",
"menus": []
},
{
"id": 5,
"name": "Green Coffee",
"location": "-8.795632,115.125848",
"balance": "2614.96",
"business_hours": "Sunday: 12:45 PM - 6:15 PM | Monday, Wednesday: 5:15 AM - 8:30 PM | Tuesday, Saturday: 1:30 PM - 3:45 PM | Thursday: 7:45 AM - 8:15 AM | Friday: 1:30 PM - 7 PM",
"menus": []
}
]


2. WhereHas

Fungsi ini digunakan untuk merender tabel kiri dan tabel kanan. Namun, syarat kondisional table kanan akan mempengaruhi hasil dari table kiri.

App\Http\Controller\RestaurantController (controller)

return Restaurant::with('menus')->whereHas('menus', function ($q){
$q->where('id', '=', 1); // id menu
})->get();

Result:

(hanya menampilkan restoran dengan menu yang sesuai syarat kondisi)

[
{
"id": 1,
"name": "Orange House",
"location": "-8.65504,115.110801",
"balance": "4483.84",
"business_hours": "Sunday: 10:45 AM - 5 PM | Monday, Friday: 2:30 PM - 8 PM | Tuesday: 11 AM - 2 PM | Wednesday: 1:15 PM - 3:15 AM | Thursday: 10 AM - 3:15 AM | Saturday: 5 AM - 11:30 AM",
"menus": [
{
"id": 1,
"restaurant_id": 1,
"name": "Kiwiberries",
"price": "10.64"
},
{
"id": 2,
"restaurant_id": 1,
"name": "Dates",
"price": "12.45"
},
{
"id": 3,
"restaurant_id": 1,
"name": "Arborio Rice",
"price": "10.59"
},
{
"id": 4,
"restaurant_id": 1,
"name": "Figs juice",
"price": "13.50"
},
{
"id": 5,
"restaurant_id": 1,
"name": "Papaya",
"price": "13.50"
},
{
"id": 6,
"restaurant_id": 1,
"name": "Watermelon",
"price": "12.56"
},
{
"id": 7,
"restaurant_id": 1,
"name": "Budweiser Wood-aged Beer",
"price": "12.38"
},
{
"id": 8,
"restaurant_id": 1,
"name": "Oranges",
"price": "11.64"
},
{
"id": 9,
"restaurant_id": 1,
"name": "Pears smoothie",
"price": "10.51"
},
{
"id": 10,
"restaurant_id": 1,
"name": "French Toast",
"price": "10.20"
},
{
"id": 11,
"restaurant_id": 1,
"name": "Jarrahdale pumpkin",
"price": "14.00"
},
{
"id": 12,
"restaurant_id": 1,
"name": "Papaw",
"price": "11.79"
},
{
"id": 13,
"restaurant_id": 1,
"name": "Salmon Nigiri",
"price": "10.15"
},
{
"id": 14,
"restaurant_id": 1,
"name": "Goji Berry smoothie",
"price": "13.88"
}
]
}
]

3. Has

Fungsi ini digunakan untuk merender table kiri yang memiliki data di tabel kanan.

App\Http\Controller\RestaurantController (controller)

return Restaurant::has('menus')->get();

Result:

(hanya menampilkan restoran yang memiliki data menu)

[
{
"id": 1,
"name": "Orange House",
"location": "-8.65504,115.110801",
"balance": "4483.84",
"business_hours": "Sunday: 10:45 AM - 5 PM | Monday, Friday: 2:30 PM - 8 PM | Tuesday: 11 AM - 2 PM | Wednesday: 1:15 PM - 3:15 AM | Thursday: 10 AM - 3:15 AM | Saturday: 5 AM - 11:30 AM"
},
{
"id": 2,
"name": "34 Grill & Tap",
"location": "-8.679412,115.136036",
"balance": "4882.81",
"business_hours": "Sun, Fri: 6 AM - 9 PM | Mon, Weds: 11:45 AM - 4:45 PM | Tues: 7:45 AM - 2 AM | Thurs: 5:45 PM - 12 AM | Sat: 10:15 AM - 9 PM"
},
{
"id": 3,
"name": "76 King",
"location": "-8.832813,115.130664",
"balance": "1320.19",
"business_hours": "Sunday: 2 PM - 7 PM | Monday, Wednesday: 3:45 PM - 5 PM | Tuesday: 11:30 AM - 3 AM | Thursday: 10 AM - 11:30 PM | Friday: 7 AM - 9:45 AM | Saturday: 12:45 PM - 1:15 PM"
},
{
"id": 4,
"name": "Sweet Steakhouse",
"location": "-8.598099,115.167311",
"balance": "4629.91",
"business_hours": "Sun: 1:15 PM - 12:30 AM | Mon: 5:30 AM - 6 PM | Tue: 10 AM - 12:15 AM | Wed: 1:45 PM - 4:45 PM | Thu: 7:15 AM - 3:45 AM | Fri: 1:30 PM - 12:45 AM | Sat: 7 AM - 11:45 AM"
},
{
"id": 5,
"name": "Green Coffee",
"location": "-8.795632,115.125848",
"balance": "2614.96",
"business_hours": "Sunday: 12:45 PM - 6:15 PM | Monday, Wednesday: 5:15 AM - 8:30 PM | Tuesday, Saturday: 1:30 PM - 3:45 PM | Thursday: 7:45 AM - 8:15 AM | Friday: 1:30 PM - 7 PM"
}
]

4. WithCount-Where

Fungsi ini digunakan untuk menghitung semua hasil pada table kanan yang tampil sesuai syarat kondisional.

App\Http\Controller\RestaurantController (controller)

return Restaurant::withCount([
'menus' => function ($q) {
$q->where('price', '<', 15.00);
}
])->get();

Result:

(menampilkan restoran dan jumlah menu dengan harga > 15.00)

[
{
"id": 1,
"name": "Orange House",
"location": "-8.65504,115.110801",
"balance": "4483.84",
"business_hours": "Sunday: 10:45 AM - 5 PM | Monday, Friday: 2:30 PM - 8 PM | Tuesday: 11 AM - 2 PM | Wednesday: 1:15 PM - 3:15 AM | Thursday: 10 AM - 3:15 AM | Saturday: 5 AM - 11:30 AM",
"menus_count": 14
},
{
"id": 2,
"name": "34 Grill & Tap",
"location": "-8.679412,115.136036",
"balance": "4882.81",
"business_hours": "Sun, Fri: 6 AM - 9 PM | Mon, Weds: 11:45 AM - 4:45 PM | Tues: 7:45 AM - 2 AM | Thurs: 5:45 PM - 12 AM | Sat: 10:15 AM - 9 PM",
"menus_count": 12
},
{
"id": 3,
"name": "76 King",
"location": "-8.832813,115.130664",
"balance": "1320.19",
"business_hours": "Sunday: 2 PM - 7 PM | Monday, Wednesday: 3:45 PM - 5 PM | Tuesday: 11:30 AM - 3 AM | Thursday: 10 AM - 11:30 PM | Friday: 7 AM - 9:45 AM | Saturday: 12:45 PM - 1:15 PM",
"menus_count": 9
},
{
"id": 4,
"name": "Sweet Steakhouse",
"location": "-8.598099,115.167311",
"balance": "4629.91",
"business_hours": "Sun: 1:15 PM - 12:30 AM | Mon: 5:30 AM - 6 PM | Tue: 10 AM - 12:15 AM | Wed: 1:45 PM - 4:45 PM | Thu: 7:15 AM - 3:45 AM | Fri: 1:30 PM - 12:45 AM | Sat: 7 AM - 11:45 AM",
"menus_count": 3
},
{
"id": 5,
"name": "Green Coffee",
"location": "-8.795632,115.125848",
"balance": "2614.96",
"business_hours": "Sunday: 12:45 PM - 6:15 PM | Monday, Wednesday: 5:15 AM - 8:30 PM | Tuesday, Saturday: 1:30 PM - 3:45 PM | Thursday: 7:45 AM - 8:15 AM | Friday: 1:30 PM - 7 PM",
"menus_count": 5
}
]

5. Having

Digunakan untuk memberi syarat kondisi pada jumlah table dengan withCount.

App\Http\Controller\RestaurantController (controller)

return Restaurant::withCount('menus')->having('menus_count', '<', 5)->get();

Result:

(menampilkan restoran dengan jumlah menu < 5)

[
{
"id": 4,
"name": "Sweet Steakhouse",
"location": "-8.598099,115.167311",
"balance": "4629.91",
"business_hours": "Sun: 1:15 PM - 12:30 AM | Mon: 5:30 AM - 6 PM | Tue: 10 AM - 12:15 AM | Wed: 1:45 PM - 4:45 PM | Thu: 7:15 AM - 3:45 AM | Fri: 1:30 PM - 12:45 AM | Sat: 7 AM - 11:45 AM",
"menus_count": 3
},
{
"id": 27,
"name": "Red Juice Bar",
"location": "-8.719262,115.116279",
"balance": "304.11",
"business_hours": "Sunday, Thursday: 7:30 AM - 12:15 AM | Monday-Tuesday: 2:30 PM - 3:15 AM | Wednesday: 2 PM - 3 AM | Friday: 2 PM - 2:45 AM | Saturday: 5:15 AM - 3:45 AM",
"menus_count": 3
},
{
"id": 31,
"name": "Sweet Pizza",
"location": "-8.706058,115.234598",
"balance": "2303.13",
"business_hours": "Sun: 7:45 AM - 1:30 AM | Mon: 12:15 PM - 3 AM | Tues: 5 AM - 7 AM | Weds: 1:15 PM - 1 AM | Thurs, Sat: 10:15 AM - 3:45 AM | Fri: 2:15 PM - 2 AM",
"menus_count": 4
},
{
"id": 35,
"name": "Golden Curry",
"location": "-8.667185,115.210803",
"balance": "4873.88",
"business_hours": "Sun: 3 PM - 2 AM | Mon-Tues: 10:30 AM - 7:15 PM | Weds-Thurs: 10:30 AM - 9 PM | Fri: 5:30 PM - 11:30 PM | Sat: 12:45 PM - 9 PM",
"menus_count": 3
},
{
"id": 44,
"name": "EG Brasserie",
"location": "-8.817656,115.222977",
"balance": "2157.21",
"business_hours": "Sun: 8 AM - 4:30 PM | Mon, Weds: 12:30 PM - 5:30 PM | Tues: 4:45 PM - 9 PM | Thurs, Sat: 6:45 AM - 7 AM",
"menus_count": 4
}
]


Oke, itulah penjelasan tentang beberapa fungsi eloquent untuk relasi data di laravel. Semoga bermanfaat! Terima kasih!

Read More

https://payclick.com/

Contact us for advertising.