Livewire provides a simple abstraction over AJAX that allows us to easily fetch records from the database and update the UI without having to write any JavaScript.
In this tutorial, I show how you can fetch records using Livewire from the MySQL database in Laravel 9.
Contents
- Install Livewire
- Add Database configuration
- Create a Table
- Create Model
- Create Controller
- Create Route
- Create Livewire Component
- Create View
- Output
- Conclusion
1. Install Livewire
You can skip this step if Livewire is already installed in your project.
Run following command to install Livewire –
composer require livewire/livewire
2. Add Database configuration
Open .env
file to update the database connection.
Specify the host, database name, username, and password.
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=tutorial DB_USERNAME=root DB_PASSWORD=
3. Create a Table
- Create a new table
employees
using migration.
php artisan make:migration create_employees_table
- Now, navigate to
database/migrations/
folder from the project root. - Find a PHP file that ends with
create_employees_table
and open it. - Define the table structure in the
up()
method.
public function up() { Schema::create('employees', function (Blueprint $table) { $table->id(); $table->string('emp_name',60); $table->string('email',80); $table->string('city',100); $table->timestamps(); }); }
- Run the migration –
php artisan migrate
- The table is been created and I added some records to it.
4. Create Model
- Create
Employees
Model –
php artisan make:model Employees
- Open
app/Models/Employees.php
file. - Specify mass assignable Model attributes – emp_name, email, and city using the
$fillable
property.
Completed Code
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Employees extends Model { use HasFactory; protected $fillable = [ 'emp_name','email','city' ]; }
5. Create Controller
Create EmployeesController
controller.
php artisan make:controller EmployeesController
Create 1 method –
- index() – Load
index
view.
Completed Code
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class EmployeesController extends Controller { public function index(){ return view('index'); } }
6. Create Route
- Open
routes/web.php
file. - Define 1 route –
- / – Load index view.
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\EmployeesController; Route::get('/', [EmployeesController::class, 'index']);
7. Create Livewire Component
Create fetchemployees
component –
php artisan make:livewire fetchemployees
This will create 2 files –
- app/Http/Livewire/Fetchemployees.php
- resources/views/livewire/fetchemployees.blade.php
Fetchemployees.php
- Open
app/Http/Livewire/Fetchemployees.php
file. - Create 2 properties –
- $records – Store fetch data.
- $employeeid – Use for data binding. Read entered value in the textbox.
- Create 2 methods –
- fetchbyid() – Fetch a record from
employees
table where$this->employeeid
inid
field. Assign fetched record to$this->records
. - fetchall() – Fetch all records from the
employees
table and assign to$this->records
.
- fetchbyid() – Fetch a record from
Completed Code
<?php namespace App\Http\Livewire; use Livewire\Component; use App\Models\Employees; class Fetchemployees extends Component { public $records; public $employeeid = 0; // Fetch record by ID public function fetchbyid(){ $this->records = Employees::orderby('id','asc') ->select('*') ->where('id',$this->employeeid) ->get(); } // Fetch all records public function fetchall(){ $this->records = Employees::orderby('id','asc')->select('*')->get(); } public function render(){ return view('livewire.fetchemployees'); } }
fetchemployees.blade.php
- Open
resources/views/livewire/fetchemployees.blade.php
file. - Create a textbox to enter employee id. Add
wire:model="employeeid"
, Here,employeeid
is a public property of theFetchemployees
component class. - Create 2 buttons –
- 1st button is used to fetch a record by entered employee id in the textbox on click –
wire:click="fetchbyid"
. Herefetchbyid
is method name in the component class. - 2nd button is used to fetch all records on click –
wire:click="fetchall"
. Here,fetchall
is method name in the component class.
- 1st button is used to fetch a record by entered employee id in the textbox on click –
- To display fetched records create a
<table >
. Loop on$records
to create new<tr >
if it is not empty.
Completed Code
<div> <!-- Fetch record by ID --> <input type='number' wire:model="employeeid" > <input type='button' value='Fetch record by ID' wire:click="fetchbyid" > <br/><br> <!-- Fetch all records --> <input type='button' value='Fetch all records' wire:click="fetchall"> <br><br> <!-- List records --> <table border='1' style='border-collapse: collapse;'> <thead> <tr> <th>Name</th> <th>Email</th> <th>City</th> </tr> </thead> <tbody> @if(!empty($records)) @foreach($records as $record) <tr> <td>{{ $record->emp_name}}</td> <td>{{ $record->email}}</td> <td>{{ $record->city}}</td> </tr> @endforeach @endif </tbody> </table> </div>
8. Create View
Create index.blade.php
file in resources/views/
folder.
Include fetchemployees
component – <livewire:fetchemployees />
and script.
Completed Code
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>How to fetch records using Livewire from MySQL in Laravel</title> <style type="text/css"> table td{ padding: 5px; } </style> </head> <body> <livewire:fetchemployees /> @livewireScripts </body> </html>
9. Output
10. Conclusion
In the example, I show you how you use livewire to fetch all records and fetch record by id. Make sure to include @livewireScripts
in the view otherwise, events do not work and data will not fetch.