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
employeesusing 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_tableand 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
EmployeesModel –
php artisan make:model Employees
- Open
app/Models/Employees.phpfile. - Specify mass assignable Model attributes – emp_name, email, and city using the
$fillableproperty.
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
indexview.
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.phpfile. - 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.phpfile. - 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
employeestable where$this->employeeidinidfield. Assign fetched record to$this->records. - fetchall() – Fetch all records from the
employeestable 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.phpfile. - Create a textbox to enter employee id. Add
wire:model="employeeid", Here,employeeidis a public property of theFetchemployeescomponent class. - Create 2 buttons –
- 1st button is used to fetch a record by entered employee id in the textbox on click –
wire:click="fetchbyid". Herefetchbyidis method name in the component class. - 2nd button is used to fetch all records on click –
wire:click="fetchall". Here,fetchallis 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$recordsto 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.