Sistem Informasi Sekolah Terintegrasi

Laravel MongoDB CRUD: Complete Guide Step By Step

Laravel   2022-06-10  

If You need to get more information about the Jessegers package, go to its Github. MongoDB is an open-source, cross-platform, document-oriented NoSQL database used for high volume data storage. MongoDB is written in C++. But, first, let’s outline our whole blog post.

NoSQL (MongoDB) seems quite unpopular on Laravel, not because no one cares, but because not many people will use Mongo over SQL since SQL is already embedded into Laravel and provides an excellent experience for newcomers to understand how Laravel works with databases.

Eloquent ORM for NoSQL

It might be more packages that handle NoSQL, but we must trust more when it’s based on the community. I have also run it in production for quite a while, and so far, I have never encountered problems.

The setup is pretty straightforward if you read the documentation — it will help you install it through Composer set up a database driver. After that, we’ll focus just on the essential things.

This package offers a Moloquent model, as the documentation states. It is an Eloquent model but made for Mongo.

How To Use Laravel With MongoDB

To use Laravel with MongoDB, use the jenssegers/mongodb package

  1. Step 1: Configure the Mongodb database in Windows.
  2. Step 2: Install and configure Laravel.
  3. Step 3: Install and configure the MongoDB package for Laravel.
  4. Step 4: Create a model, route, controller, and view file.
  5. Step 5: From the view file, fill in the input details and send the POST request to the Laravel server, saving the data into the MongoDB database.
  6. Step 6: Display the data in the frontend using the Laravel view.
  7. Step 7: Create an edit form and update the data into the database.
  8. Step 8: Write the logic to delete the data from the database inside the controller file.

Okay, let’s go through the above steps one by one.

 

Configure the Mongodb database in Windows

If you are connecting the MongoDB database to Laravel or any PHP application, you might face one issue,: the PHP MongoDB driver.

The package we will install in Laravel requires php mongodb driver installs on our machine. But if you try to download a direct package without installing the driver, you will face an error that says you have one extension missing in your PHP extension files or other errors depending on your configured environment.

It is the most critical issue in this scenario. Luckily I have the best possible solution for you. So I will help you connect your Laravel application to the MongoDB database. So first, you need to go to this Link. I am assuming that you are using Windows.

https://pecl.php.net/package/mongodb/1.3.0/windows

Now, right now, I am using Windows 10 32Bit OS, and my PHP version is 7.1. So you will choose the download file based on your machine configuration.

Download the DLL Zip file and extract it inside your PHP’s ext directory. That ext directory contains many DLL extensions files already.

I am using XAMPP so, your directory path to the ext is C:\xampp\php\ext. The DLL file name of the MongoDB driver is  php_mongodb.dll. So make sure that this file is installed correctly in the ext directory.

Now, open the php.ini file and add the following line. If the line is already there, then check if it is commented or not; if commented, then remove the semicolon to uncomment. To work with MongoDB, this driver needs to be bootstrapped at the start of the server.

 

extension=php_mongodb.dll

Save that file.

Please restart the server. It is essential; otherwise, our changes will not reflect.

Now, you will be able to connect your PHP application to the MongoDB database. In our case, it is the Laravel MongoDB connection. Now, we will be ready to start our Laravel MongoDB CRUD Tutorial With an Example.

Laravel MongoDB CRUD

To create a crud application in Laravel with MongoDB, use the Authenticatable model. The User model extends an Authenticatable model. One of the big problems that I have encountered with MongoDB was when it was about the User. Unfortunately, MongoDB does not support the default model that Laravel offers, so we’ll have to use the one that comes with the package:

use Jenssegers\Mongodb\Auth\User as Authenticatable;

class User extends Authenticatable
{
   //
}

If you want to use Laravel Passport with MongoDB, make sure you use the designmynight/laravel-mongodb-passport. It will provide you another Authenticatable class that will do the job for you!

Step 1: Install Laravel Project

Download New Laravel Project by the writing following command.

composer create-project --prefer-dist laravel/laravel laravelmongodb

Step 2: Configure MongoDB Database

So now, let’s configure the MongoDB Database in our laravel application. So open the .env file add the following detail.

//.env

MONGO_DB_HOST=127.0.0.1
MONGO_DB_PORT=27017
MONGO_DB_DATABASE=mongocrud
MONGO_DB_USERNAME=
MONGO_DB_PASSWORD=

Next, we want to add a new mongodb connection on config >> database.php file.

//database.php

'connections' => [

        ...
     'mongodb' => [
            'driver'   => 'mongodb',
            'host'     => env('MONGO_DB_HOST', 'localhost'),
            'port'     => env('MONGO_DB_PORT', 27017),
            'database' => env('MONGO_DB_DATABASE'),
            'username' => env('MONGO_DB_USERNAME'),
            'password' => env('MONGO_DB_PASSWORD'),
            'options'  => []
        ],
    ]

Step 3: Install Laravel MongoDB Package

Now we will install the jenssegers/mongodb Package in our project.

composer require jenssegers/mongodb

Step 4: Define providers.

Find the providers in config >> app.php file and register the MongodbServiceProvider.

'providers' => [
        Jenssegers\Mongodb\MongodbServiceProvider::class,
           ]

Step 5: Create a model

Type the following command in your terminal.

php artisan make:model Car

It will create a Car.php file.

The package includes a MongoDB-enabled Eloquent class that you can use to establish models for corresponding collections. Add the code in the Car.php file.

//Car.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class Car extends Eloquent
{
    protected $connection = 'mongodb';
    protected $collection = 'cars';
    
    protected $fillable = [
        'carcompany', 'model','price'
    ];
}

SQL works with tables, NoSQL works with collections. So instead of the $table variable, we’ll have a $collection variable.

Also, it’s pretty essential to note that the primary key cannot be set through $primaryKey, and the $incrementing is unavailable.

Additionally, you might want to specify that the model belongs to the mongodb connection you have created earlier.

 

You must be at peace with the fact that MongoDB auto-assigns primary keys to documents (the equivalent of rows from SQL). So, to access the primary key of a document, you have to use the same attribute name as in the basic model.

echo 'The Car ID is: '. $car->_id;
echo 'The Car ID is '. $car->id; // they both work

Using find() uses the primary key field to retrieve the result.

There are almost no schemas to define

In NoSQL, we don’t have schemas to define. So we can go as crazy as we want. But we can take advantage of the migrations to define indexes, unique fields, and other mongo-specific fields.

See the following code.

Schema::create('cars', function ($collection) {
   $collection->index('slug');
   $collection->unique('slug');
});

The migration process is the same. To run the migrations, make sure that the default driver set (the DB_CONNECTION env variable) is set to mongodb.

php artisan migrate

 In case you want to run both SQL and NoSQL in the same project, I can give you some hints:

  1. Move your SQL migrations to a folder inside the migrations folder. I’ll call it MySQL.
  2. All models that work with the default database driver should extend the right model.

Running migrations should be done for either local or in production for the default driver (i.e., when DB_CONNECTION is set to mongodb).

For MySQL driver,

php artisan migrate --database=mysql --path=database/migrations/mysql/

So, as long as NoSQL is schemaless, we can define it while working with data. In MongoDB, we’re able to drop fields whenever we want.

So, if we want to drop some fields, we can do it using the drop method.

$ppl = Employee::where('name', 'TrevorNoah')->first();
$ppl->drop('field1');
// or
$john->drop(['field1', 'field2']); // works with more

Now, let’s create a view file.

Step 6: Create a view file

Create a file in resources  >>  views  >>   carcreate.blade.php and put the following code in it.

<!-- carcreate.blade.php -->

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Laravel MongoDB CRUD Tutorial With Example</title>
    <link rel="stylesheet" href="{{asset('css/app.css')}}">
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">  
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>  
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>  
  </head>
  <body>
    <div class="container">
      <h2>Laravel MongoDB CRUD Tutorial With Example</h2><br/>
      <div class="container">
    </div>
      <form method="post" action="{{url('add')}}">
        @csrf
        <div class="row">
          <div class="col-md-4"></div>
          <div class="form-group col-md-4">
            <label for="Carcompany">Car Company:</label>
            <input type="text" class="form-control" name="carcompany">
          </div>
        </div>
        <div class="row">
          <div class="col-md-4"></div>
          <div class="form-group col-md-4">
            <label for="Model">Model:</label>
            <input type="text" class="form-control" name="model">
          </div>
        </div>
        <div class="row">
          <div class="col-md-4"></div>
          <div class="form-group col-md-4">
            <label for="Price">Price:</label>
            <input type="text" class="form-control" name="price">
          </div>
        </div>
        <div class="row">
          <div class="col-md-4"></div>
          <div class="form-group col-md-4">
            <button type="submit" class="btn btn-success">Submit</button>
          </div>
        </div>
      </form>
   </div>
  </body>
</html>

Step 7: Create one controller and route

php artisan make:controller CarController

It will create a controller file called CarController.php.

We register routes in routes  >>  web.php file. So let us do it.

//web.php

Route::get('add','CarController@create');
Route::post('add','CarController@store');
Route::get('car','CarController@index');
Route::get('edit/{id}','CarController@edit');
Route::post('edit/{id}','CarController@update');
Route::delete('{id}','CarController@destroy');

Add code to create() function to display view.

//CarController.php

public function create()
    {
        return view('carcreate');
    }

 Step 8: Save Data into MongoDB Database

We need to code the store function to save the data in the database.

//CarController.php

use App\Car;

   public function store(Request $request)
    {
        $car = new Car();
        $car->carcompany = $request->get('carcompany');
        $car->model = $request->get('model');
        $car->price = $request->get('price');        
        $car->save();
        return redirect('car')->with('success', 'Car has been successfully added');
    }

Laravel MongoDB CRUD Tutorial

Step 9: Make an index page to list the car information.

For that frontend, we need to send the data to the carindex.blade.php. So, in the CarController.php file, we need to write the code to get the data and return it to the index view.

//PostController.php

public function index()
    {
        $cars=Car::all();
        return view('carindex',compact('cars'));
    }

In resources,>> views, create a different blade file called carindex.blade.php file and place the following code in it.

<!-- carindex.blade.php -->

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Index Page</title>
    <link rel="stylesheet" href="{{asset('css/app.css')}}">
  </head>
  <body>
    <div class="container">
    <br />
    @if (\Session::has('success'))
      <div class="alert alert-success">
        <p>{{ \Session::get('success') }}</p>
      </div><br />
     @endif
    <table class="table table-striped">
    <thead>
      <tr>
        <th>ID</th>
        <th>Company</th>
        <th>Model</th>
        <th>Price</th>
        <th colspan="2">Action</th>
      </tr>
    </thead>
    <tbody>
      
      @foreach($cars as $car)
      <tr>
        <td>{{$car->id}}</td>
        <td>{{$car->carcompany}}</td>
        <td>{{$car->model}}</td>
        <td>{{$car->price}}</td>
        <td><a href="{{action('CarController@edit', $car->id)}}" class="btn btn-warning">Edit</a></td>
        <td>
          <form action="{{action('CarController@destroy', $car->id)}}" method="post">
            @csrf
            <input name="_method" type="hidden" value="DELETE">
            <button class="btn btn-danger" type="submit">Delete</button>
          </form>
        </td>
      </tr>
      @endforeach
    </tbody>
  </table>
  </div>
  </body>
</html>

So, if you type the URL: http://localhost:8000/car, you can see the page like the below image.

Laravel MongoDB CRUD Example

Step 10: Build an edit view for updating the Car                Information

The next step will be to call the edit function in the CarController.php file and add the following code to it.

public function edit($id)
    {
        $car = Car::find($id);
        return view('caredit',compact('car','id'));
    }

Now, make a caredit.blade.php file inside resources  >>  views folder.

<!-- caredit.blade.php -->

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Laravel MongoDB CRUD Tutorial With Example</title>
    <link rel="stylesheet" href="{{asset('css/app.css')}}">
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">  
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>  
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>  
  </head>
  <body>
    <div class="container">
      <h2>Edit A Form</h2><br/>
      <div class="container">
    </div>
      <form method="post" action="{{action('CarController@update', $id)}}">
        @csrf
        <div class="row">
          <div class="col-md-4"></div>
          <div class="form-group col-md-4">
            <label for="Carcompany">Car Company:</label>
            <input type="text" class="form-control" name="carcompany" value="{{$car->carcompany}}">
          </div>
        </div>
        <div class="row">
          <div class="col-md-4"></div>
          <div class="form-group col-md-4">
            <label for="Model">Model:</label>
            <input type="text" class="form-control" name="model" value="{{$car->model}}">
          </div>
        </div>
        <div class="row">
          <div class="col-md-4"></div>
          <div class="form-group col-md-4">
            <label for="Price">Price:</label>
            <input type="text" class="form-control" name="price" value="{{$car->price}}">
          </div>
        </div>
        <div class="row">
          <div class="col-md-4"></div>
          <div class="form-group col-md-4">
            <button type="submit" class="btn btn-success">Update</button>
          </div>
        </div>
      </form>
   </div>
  </body>
</html>

The next move will be to add some code in the update() function.

//CarController.php

public function update(Request $request, $id)
    {
        $car= Car::find($id);
        $car->carcompany = $request->get('carcompany');
        $car->model = $request->get('model');
        $car->price = $request->get('price');        
        $car->save();
        return redirect('car')->with('success', 'Car has been successfully update');
    }

laravel mongodb tutorial

Step 11: Delete the Car Information

//CarController.php

public function destroy($id)
    {
        $car = Car::find($id);
        $car->delete();
        return redirect('car')->with('success','Car has been  deleted');
    }

The final Code of CarController.php looks like the below code.

//CarController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Car;

class CarController extends Controller
{
    public function create()
    {
        return view('carcreate');
    }
    public function store(Request $request)
    {
        $car=new Car();
        $car->carcompany = $request->get('carcompany');
        $car->model = $request->get('model');
        $car->price = $request->get('price');        
        $car->save();
        return redirect('car')->with('success', 'Car has been successfully added');
    }
    public function index()
    {
        $cars=Car::all();
        return view('carindex',compact('cars'));
    }
    public function edit($id)
    {
        $car = Car::find($id);
        return view('caredit',compact('car','id'));
    }
    public function update(Request $request, $id)
    {
        $car= Car::find($id);
        $car->carcompany = $request->get('carcompany');
        $car->model = $request->get('model');
        $car->price = $request->get('price');        
        $car->save();
        return redirect('car')->with('success', 'Car has been successfully update');
    }
    public function destroy($id)
    {
        $car = Car::find($id);
        $car->delete();
        return redirect('car')->with('success','Car has been  deleted');
    }
}

Finally, Our Laravel MongoDB CRUD Tutorial With Example is over. 

Advantages of MongoDB

Even for high-traffic apps, MongoDB is fast and reliable. On average, it consumes around 4 GB of RAM with about 600 million document reads, writes, and deletes on an entire month, with an average of 600 writes and reads, combined, per second.

I don’t recommend using it for caching — whenever you want to cache, remember to use memory over disk because it provides less friction and more speed of accessing and writing.

 

Referensi : https://appdividend.com/2022/01/28/laravel-mongodb-crud/