Laravel MongoDB CRUD创建教程与实例

749 阅读7分钟

Laravel MongoDB CRUD Tutorial With Example

如果你需要更多关于Jessegers包的信息,可以去它的Github 。MongoDB是一个开源的、跨平台的、面向文档的NoSQL数据库,用于大批量的数据存储。MongoDB是用C++编写的。但是,首先,让我们概述一下我们的整个博文。

NoSQL(MongoDB)在Laravel上似乎很不受欢迎, 不是因为没人关心, 而是因为没有多少人会使用Mongo而不是SQL, 因为SQL已经嵌入到Laravel中, 为新人了解Laravel如何与数据库一起工作提供了很好的体验。

用于NoSQL的Eloquent ORM

这可能是更多的处理NoSQL的包, 但当它是基于社区的时候,我们必须更加信任。我也在生产中运行了很长时间, 到目前为止, 我还没有遇到过问题.

如果你阅读文档,设置是非常简单的--它会帮助你通过Composer安装它,并设置一个数据库驱动。之后,我们将只关注基本的东西。

这个软件包提供了一个Moloquent模型,正如文档中所说。它是一个Eloquent模型,但为Mongo制作。

如何使用Laravel和MongoDB

使用 LaravelMongoDB,请使用jenssegers/mongodb 包**。**

  1. 步骤1: 在Windows中配置Mongodb数据库.
  2. 第2步: 安装并配置Laravel.
  3. 第3步: 安装并配置Laravel的MongoDB包.
  4. 第4步: 创建一个模型, 路线, 控制器, 和视图文件.
  5. 第5步: 从视图文件中, 填写输入的详细信息,并发送POST请求到Laravel服务器,将数据保存到MongoDB数据库中。
  6. 第6步: 使用Laravel视图将数据显示在前面。
  7. 第7步: 创建一个编辑表单并更新数据库中的数据.
  8. 第8步: 在控制器文件中编写逻辑来删除数据库中的数据。

好的,让我们逐一完成上述步骤。

在Windows中配置Mongodb数据库

如果你要将MongoDB数据库连接到Laravel或任何PHP应用程序,你可能会面临一个问题,即:PHP MongoDB驱动程序。

我们将在Laravel中安装的软件包需要在我们的机器上安装php mongodb驱动。但是如果你试图在没有安装驱动的情况下直接下载一个包, 你会面临一个错误, 说你的PHP扩展文件中缺少一个扩展, 或者其他错误, 这取决于你的配置环境.

这是这种情况下最关键的问题。幸运的是,我为你提供了最好的解决方案。所以我将帮助你把你的Laravel应用程序连接到MongoDB数据库。所以首先, 你需要进入这个链接.我假设你使用的是Windows。

pecl.php.net/package/mon…

现在, 我使用的是Windows 10 32Bit操作系统, 而我的PHP版本是7.1.所以你要根据你的机器配置来选择下载文件。

mongodb driver

下载DLL Zip文件并将其解压到你的PHP的ext目录中。那个ext 目录已经包含了许多DLL扩展文件。

我使用的是XAMPP,所以你的ext目录的路径是C:\xampp\php\ext。MongoDB驱动程序的DLL文件名是php_mongodb.dll 。所以要确保这个文件正确安装在ext目录下。

现在,打开php.ini 文件并添加以下一行。如果该行已经存在,那么检查它是否有注释;如果有注释,那么删除分号以取消注释。为了与MongoDB一起工作,这个驱动需要在服务器启动时被引导。

extension=php_mongodb.dll

保存该文件。

请重新启动服务器。这是必须的;否则,我们的变化将无法反映出来。

现在,你可以将你的PHP应用程序连接到MongoDB数据库。在我们的例子中,它是Laravel MongoDB的连接。然后, 我们就可以开始我们的Laravel MongoDB CRUD教程了,有一个例子。

Laravel MongoDB CRUD

要在Laravel中用MongoDB创建一个crud应用程序,使用Authenticatable模型。用户模型扩展了一个Authenticatable 模型。我在使用MongoDB时遇到的一个大问题是关于用户的。不幸的是, MongoDB并不支持Laravel提供的默认模型, 所以我们必须使用软件包中的模型:

use Jenssegers\Mongodb\Auth\User as Authenticatable;

class User extends Authenticatable
{
   //
}

如果你想在MongoDB中使用Laravel Passport, 确保你使用designmynight/laravel-mongodb-passport.它将为你提供另一个Authenticatable类,它将为你完成这项工作!

步骤1: 安装Laravel项目

通过编写以下命令下载新的Laravel项目.

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

第2步: 配置MongoDB数据库

所以现在, 让我们在我们的Laravel应用程序中配置 MongoDB数据库.所以打开**.env**文件并添加以下细节。

//.env

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

接下来, 我们要在config >> database.php 文件中添加一个新的mongodb连接。

//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'  => []
        ],
    ]

第3步: 安装Laravel MongoDB包

现在我们将在我们的项目中安装jenssegers/mongodb包

composer require jenssegers/mongodb

第4步: 定义提供者.

config >> app.php文件中找到提供者,并注册MongodbServiceProvider

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

第5步:创建一个模型

在你的终端键入以下命令。

php artisan make:model Car

它将创建一个 Car.php 文件。

该包包括一个支持MongoDB的Eloquent类,你可以用它来为相应的集合建立模型。在Car.php文件中添加代码。

//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适用于表,而NoSQL适用于集合。因此, 我们将有一个table变量,而不是**table** 变量,而不是collection变量。

另外,必须注意的是,主键不能通过**primaryKey设置primaryKey**设置**,**而**incrementing**是不可用的。

此外,你可能想指定该模型属于你之前创建的mongodb连接。

你必须安下心来,MongoDB会自动将主键分配给文档(相当于SQL中的行)。所以,要访问一个文档的主键,你必须使用与基本模型中相同的属性名称。

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

使用find()使用主键字段来检索结果。

几乎没有需要定义的模式

在NoSQL中,我们没有模式需要定义。所以我们可以随心所欲地去做。但是我们可以利用迁移的优势来定义索引、唯一字段和其他mongo特有的字段。

请看下面的代码。

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

迁移的过程是一样的。要运行迁移,请确保默认的驱动设置(DB_CONNECTION环境变量)被设置为mongodb。

php artisan migrate

如果你想在同一个项目中同时运行SQL和NoSQL,我可以给你一些提示。

  1. 把你的SQL迁移移到migrations文件夹里面的一个文件夹。我把它叫做MySQL。
  2. 所有使用默认数据库驱动的模型都应该扩展正确的模型。

对于默认驱动,运行迁移应该针对本地或生产(即当DB_CONNECTION被设置为mongodb时)。

对于MySQL驱动。

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

所以,只要NoSQL是无模式的,我们就可以在处理数据时定义它。在MongoDB中,我们能够随时删除字段。

所以,如果我们想放弃一些字段,我们可以用drop方法来做。

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

现在,让我们来创建一个视图文件。

第6步:创建一个视图文件

资源>>视图>>carcreate.blade.php 中创建一个文件,并放入以下代码。

<!-- 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>

第7步:创建一个控制器和路由

php artisan make:controller CarController

它将创建一个名为CarController.php的控制器文件**。**

我们在路由>>web.php 文件中注册路由。所以让我们来做吧。

//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');

create() 函数中添加代码以显示视图。

//CarController.php

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

第8步:将数据保存到MongoDB数据库中

我们需要编码存储函数来保存数据到数据库中。

//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

第9步:制作一个索引页来列出汽车信息。

对于该前端,我们需要将数据发送到carindex.blade.php。 因此,在CarController.php 文件中,我们需要写代码来获取数据并将其返回到索引视图中。

//PostController.php

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

resources,>>views中**,创建一个名为carindex.blade.php** 的不同blade文件,并在其中放置以下代码。

<!-- 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>

因此,如果你输入URL**:http://localhost:8000/car,** 你可以看到如下图所示的页面。

Laravel MongoDB CRUD Example

第10步。建立一个更新汽车信息的编辑视图

下一步将在CarController.php 文件中调用编辑功能,并添加以下代码。

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

现在,在resources >> views 文件夹下建立一个caredit.blade.php 文件。

<!-- 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>

下一步将是在**update()**函数中添加一些代码。

//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

第11步:删除汽车信息

//CarController.php

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

CarController.php的最终代码看起来像下面的代码。

//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');
    }
}

最后,我们的 Laravel MongoDB CRUD教程与实例 ,结束了。

MongoDB的优势

即使是高流量的应用程序, MongoDB是快速和可靠的。平均来说,它消耗了大约4GB的内存,在整个月中大约有6亿次的文档读取、写入和删除,平均每秒钟有600次的写入和读取,合在一起。

我不建议用它来做缓存--无论何时你想做缓存,记得使用内存而不是磁盘,因为它能提供更少的摩擦,更快的访问和写入。