Table of Contents
Introduction
In this example I am going to build CodeIgniter 4 MongoDB CRUD example. CRUD is an acronym and stands for Create, Read, Update and Delete operations. SO, here I am going to fetch record(s) from MongoDB NoSQL database, creating a new record and storing into MongoDB collection, updating the existing record and deleting the existing record.
MongoDB is one of the widely used NoSQL(Not only SQL) database in market today. MongoDB is a document database with the scalability and flexibility that you want with the querying and indexing that you need. Often you come across a situation where you end up using MongoDB with PHP based framework Codeigniter 4.
Related Post:
Prerequisites
PHP 7.4.22, CodeIgniter 4.1.6, MongoDB 5.0.5 (or 4+), Apache HTTP Server (Optional)
PHP and MongoDB Configurations
Project Directory
It’s assumed that you have setup PHP and CodeIgniter in Windows system.
Now I will create a project root directory called codeigniter-mongodb-crud.
Now move all the directories and files from CodeIgniter framework into the project root directory.
I may not mention the project root directory in subsequent sections and I will assume that I am talking with respect to the project root directory.
CRUD Application using CodeIgniter 4 and MongoDB
Now I will show you how to build CRUD application using MongoDB NoSQL database and CodeIgniter framework.
MongoDB Config
As a first step I want to declare some variables for MongoDB configurations.
The variables are declared into a config file app/Config/MongoDbConfig.php. You may want to read how to create custom config file in CodeIgniter 4.
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
/**
* Author: https://roytuts.com
*/
class MongoDbConfig extends BaseConfig {
public $host = 'localhost';
public $port = 27017;
public $username = '';
public $password = '';
public $authRequired = false;
}
MongoDB Library
I am creating a custom library to build a MongoDB database connection and the same connection will be used to perform database operations.
The following code is written into a file app/libraries/MongoDb.php file.
<?php
namespace App\Libraries;
/**
* Author: https://roytuts.com
*/
class MongoDB {
private $conn;
function __construct() {
$config = new \Config\MongoDbConfig();
$host = $config->host;
$port = $config->port;
$username = $config->username;
$password = $config->password;
$authRequired = $config->authRequired;
try {
if($authRequired === true) {
$this->conn = new \MongoDB\Driver\Manager('mongodb://' . $username . ':' . $password . '@' . $host. ':' . $port);
} else {
$this->conn = new \MongoDB\Driver\Manager('mongodb://' . $host. ':' . $port);
}
} catch(MongoDB\Driver\Exception\MongoConnectionException $ex) {
show_error('Couldn\'t connect to mongodb: ' . $ex->getMessage(), 500);
}
}
function getConn() {
return $this->conn;
}
}
Model Class
The model class is responsible for performing database operations into MongoDB through CodeIgniter framework. Here, I am fetching data from MongoDB, inserting data into MongoDB, updating data into MongoDB and deleting data from MongoDB.
The model code is written into app/Models/UserModel.php file.
<?php
namespace App\Models;
use App\Libraries\MongoDb;
class UserModel {
private $database = 'roytuts';
private $collection = 'user';
private $conn;
function __construct() {
$mongodb = new MongoDb();
$this->conn = $mongodb->getConn();
}
function get_user_list() {
try {
$filter = [];
$query = new \MongoDB\Driver\Query($filter);
$result = $this->conn->executeQuery($this->database . '.' . $this->collection, $query);
return $result->toArray();
} catch(\MongoDB\Driver\Exception\RuntimeException $ex) {
show_error('Error while fetching users: ' . $ex->getMessage(), 500);
}
}
function get_user($_id) {
try {
$filter = ['_id' => new \MongoDB\BSON\ObjectId($_id)];
$query = new \MongoDB\Driver\Query($filter);
$result = $this->conn->executeQuery($this->database.'.'.$this->collection, $query);
foreach($result as $user) {
return $user;
}
return null;
} catch(\MongoDB\Driver\Exception\RuntimeException $ex) {
show_error('Error while fetching user: ' . $ex->getMessage(), 500);
}
}
function create_user($name, $email) {
try {
$user = array(
'name' => $name,
'email' => $email
);
$query = new \MongoDB\Driver\BulkWrite();
$query->insert($user);
$result = $this->conn->executeBulkWrite($this->database.'.'.$this->collection, $query);
if($result->getInsertedCount() == 1) {
return true;
}
return false;
} catch(\MongoDB\Driver\Exception\RuntimeException $ex) {
show_error('Error while saving users: ' . $ex->getMessage(), 500);
}
}
function update_user($_id, $name, $email) {
try {
$query = new \MongoDB\Driver\BulkWrite();
$query->update(['_id' => new \MongoDB\BSON\ObjectId($_id)], ['$set' => array('name' => $name, 'email' => $email)]);
$result = $this->conn->executeBulkWrite($this->database . '.' . $this->collection, $query);
if($result->getModifiedCount()) {
return true;
}
return false;
} catch(\MongoDB\Driver\Exception\RuntimeException $ex) {
show_error('Error while updating users: ' . $ex->getMessage(), 500);
}
}
function delete_user($_id) {
try {
$query = new \MongoDB\Driver\BulkWrite();
$query->delete(['_id' => new \MongoDB\BSON\ObjectId($_id)]);
$result = $this->conn->executeBulkWrite($this->database . '.' . $this->collection, $query);
if($result->getDeletedCount() == 1) {
return true;
}
return false;
} catch(\MongoDB\Driver\Exception\RuntimeException $ex) {
show_error('Error while deleting users: ' . $ex->getMessage(), 500);
}
}
}
Controller Class
The controller class is responsible for handling clients’ requests and responses. The controller functions validates the input data coming from the end users before doing some operations.
The CRUD functions interacts with model class to perform the required actions.
The following code is written into a file app/Controllers/UserController.php file.
<?php
namespace App\Controllers;
use App\Models\UserModel;
class UserController extends BaseController {
private $usermodel;
public function __construct() {
$this->usermodel = new UserModel();
}
public function index() {
$data['users'] = $this->usermodel->get_user_list();
return view('users', $data);
}
public function create() {
helper(['form', 'url']);
if($this->request->getPost('submit')) {
$validation = \Config\Services::validation();
$validation->setRules([
'name' => ['label' => 'Full Name', 'rules' => 'trim|required'],
'email' => ['label' => 'Email Address', 'rules' => 'trim|required|valid_email']
]);
if (!$validation->withRequest($this->request)->run()) {
echo view('user_create', ['errors' => $validation->getErrors()]);
} else {
$result = $this->usermodel->create_user($this->request->getPost('name'), $this->request->getPost('email'));
if($result === true) {
return redirect()->to(site_url());
} else {
echo view('user_create', ['error' => 'Error occurred during saving data']);
}
}
} else {
echo view('user_create');
}
}
function update($_id) {
helper(['form', 'url']);
if($this->request->getPost('submit')) {
$validation = \Config\Services::validation();
$validation->setRules([
'name' => ['label' => 'Full Name', 'rules' => 'trim|required'],
'email' => ['label' => 'Email Address', 'rules' => 'trim|required|valid_email']
]);
if (!$validation->withRequest($this->request)->run()) {
echo view('user_update', ['errors' => $validation->getErrors()]);
} else {
$result = $this->usermodel->update_user($_id, $this->request->getPost('name'), $this->request->getPost('email'));
if($result === true) {
return redirect()->to(site_url());
} else {
echo view('user_update', ['error' => 'Error occurred during updating data']);
}
}
} else {
$data['user'] = $this->usermodel->get_user($_id);
echo view('user_update', $data);
}
}
function delete($_id) {
if ($_id) {
$this->usermodel->delete_user($_id);
}
return redirect()->to(site_url());
}
}
Views
The view files are required to display data from server side to user interface (UI). The view files are created under app/Views folder.
List Records
The following PHP file users.php is used to display a list of user records on UI.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Codeigniter 4 MongoDB CRUD Example</title>
<meta name="description" content="The small framework with powerful features">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/png" href="/favicon.ico"/>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
</head>
<body>
<div>
<h1>Codeigniter 4 MongoDB Create Read Update Delete Example</h1>
<div>
<?php echo anchor('/usercontroller/create', 'Create User');?>
</div>
<div id="body">
<?php
if ($users) {
?>
<table class="datatable">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Acions</th>
</tr>
</thead>
<tbody>
<?php
$i = 0;
foreach ($users as $user) {
$col_class = ($i % 2 == 0 ? 'odd_col' : 'even_col');
$i++;
?>
<tr class="<?php echo $col_class; ?>">
<td>
<?php echo $user->name; ?>
</td>
<td>
<?php echo $user->email; ?>
</td>
<td>
<?php echo anchor('/usercontroller/update/' . $user->_id, 'Update'); ?>
<?php echo anchor('/usercontroller/delete/' . $user->_id, 'Delete', array('onclick' => "return confirm('Do you want delete this record')")); ?>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
<?php
} else {
echo '<div style="color:red;"><p>No Record Found!</p></div>';
}
?>
</div>
</div>
</body>
</html>
Table Style
A basic style is applied to the tabular data which are displayed on the UI. The following content is written into public/css/style.css file.
The alternate row (odd or even) color will be different.
table.datatable {
width:100%;
border: none;
background:#fff;
}
table.datatable td.table_foot {
border: none;
background: #fff;
text-align: center;
}
table.datatable tr.odd_col {
background: none;
}
table.datatable tr.even_col {
background: #ddd;
}
table.datatable td {
font-size:10pt;
padding:5px 10px;
border-bottom:1px solid #ddd;
text-align: left;
}
table.datatable th {
text-align: left;
font-size: 8pt;
padding: 10px 10px 7px;
text-transform: uppercase;
color: #fff;
background:url('../img/table/head.gif') left -5px repeat-x;
font-family: sans-serif;
}
Create Record
The following code is written into a file user_create.php. This file displays the input fields on the UI where user enters details and saves them into MongoDB.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Codeigniter MongoDB Create Read Update Delete Example</title>
</head>
<body>
<div id="container">
<h1>Codeigniter 4 MongoDB Create Read Update Delete Example</h1>
<div>
<?php echo anchor('/usercontroller', 'Back to Users');?>
</div>
<div id="body">
<?php
if(isset($errors)):
?>
<ul style="list-style: none; color: red;">
<?php foreach ($errors as $err) : ?>
<li><?= esc($err) ?></li>
<?php endforeach ?>
</ul>
<?php
endif;
?>
<?php
if (isset($error)) {
echo '<p style="color:red;">' . $error . '</p>';
}
?>
<?php
$attributes = array('name' => 'form', 'id' => 'form');
echo form_open(uri_string(), $attributes);
?>
<h5>Full Name</h5>
<input type="text" name="name" value="<?php echo set_value('name');?>" size="50" />
<h5>Email Address</h5>
<input type="text" name="email" value="<?php echo set_value('email');?>" size="50" />
<p><input type="submit" name="submit" value="Submit"/></p>
<?php echo form_close(); ?>
</div>
</div>
</body>
</html>
Update Record
The following code is written into a file user_update.php. This form is used to update the existing user information.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Codeigniter MongoDB Create Read Update Delete Example</title>
</head>
<body>
<div id="container">
<h1>Codeigniter 4 MongoDB Create Read Update Delete Example</h1>
<div>
<?php echo anchor('/usercontroller', 'Back to Users');?>
</div>
<div id="body">
<?php
if(isset($errors)):
?>
<ul style="list-style: none; color: red;">
<?php foreach ($errors as $err) : ?>
<li><?= esc($err) ?></li>
<?php endforeach ?>
</ul>
<?php
endif;
?>
<?php
if (isset($error)) {
echo '<p style="color:red;">' . $error . '</p>';
}
?>
<?php
$attributes = array('name' => 'form', 'id' => 'form');
echo form_open(uri_string(), $attributes);
?>
<h5>Full Name</h5>
<input type="text" name="name" value="<?php echo isset($user)?$user->name:set_value('name'); ?>" size="50" />
<h5>Email Address</h5>
<input type="text" name="email" value="<?php echo isset($user)?$user->email:set_value('email'); ?>" size="50" />
<p><input type="submit" name="submit" value="Submit"/></p>
<?php echo form_close(); ?>
</div>
</div>
</body>
</html>
Route Config
You need to change the default controller in the app/Routes/Route.php file as UserController is the default controller instead of Home.
You need to change as $routes->setDefaultController('UserController');
and $routes->get('/', 'UserController::index');
.
Testing CodeIgniter 4 MongoDB CRUD Example
You can access the application via CLI interface by executing the command php spark serve
on the project’s root directory from the command line tool.
Now access the application in the browser via URL http://localhost:8080.
Initially there will be no record, so you will see the following message – No Record Found!

Create new records using the following form.

After successful record creation, you will be redirected to a page where a list of users is displayed.

I have created another record to show you how alternate rows show different colors.

Update record: I am updating the second record using the following form.

After updating the record, you will be again redirected to the list of users page.

Delete a record: I am deleting the first record where a confirmation for deleting the record is required.

After deleting the first record you will be redirected to the user list page.

Hope you got an idea how to build CRUD application using CodeIgniter 4 and MongoDB NoSQL database.