
如果你需要更多关于Jessegers包的信息,可以去它的Github 。MongoDB是一个开源的、跨平台的、面向文档的NoSQL数据库,用于大批量的数据存储。MongoDB是用C++编写的。但是,首先,让我们概述一下我们的整个博文。
NoSQL(MongoDB)在Laravel上似乎很不受欢迎, 不是因为没人关心, 而是因为没有多少人会使用Mongo而不是SQL, 因为SQL已经嵌入到Laravel中, 为新人了解Laravel如何与数据库一起工作提供了很好的体验。
用于NoSQL的Eloquent ORM
这可能是更多的处理NoSQL的包, 但当它是基于社区的时候,我们必须更加信任。我也在生产中运行了很长时间, 到目前为止, 我还没有遇到过问题.
如果你阅读文档,设置是非常简单的--它会帮助你通过Composer安装它,并设置一个数据库驱动。之后,我们将只关注基本的东西。
这个软件包提供了一个Moloquent模型,正如文档中所说。它是一个Eloquent模型,但为Mongo制作。
如何使用Laravel和MongoDB
要使用 Laravel与MongoDB,请使用jenssegers/mongodb 包**。**
- 步骤1: 在Windows中配置Mongodb数据库.
- 第2步: 安装并配置Laravel.
- 第3步: 安装并配置Laravel的MongoDB包.
- 第4步: 创建一个模型, 路线, 控制器, 和视图文件.
- 第5步: 从视图文件中, 填写输入的详细信息,并发送POST请求到Laravel服务器,将数据保存到MongoDB数据库中。
- 第6步: 使用Laravel视图将数据显示在前面。
- 第7步: 创建一个编辑表单并更新数据库中的数据.
- 第8步: 在控制器文件中编写逻辑来删除数据库中的数据。
好的,让我们逐一完成上述步骤。
在Windows中配置Mongodb数据库
如果你要将MongoDB数据库连接到Laravel或任何PHP应用程序,你可能会面临一个问题,即:PHP MongoDB驱动程序。
我们将在Laravel中安装的软件包需要在我们的机器上安装php mongodb驱动。但是如果你试图在没有安装驱动的情况下直接下载一个包, 你会面临一个错误, 说你的PHP扩展文件中缺少一个扩展, 或者其他错误, 这取决于你的配置环境.
这是这种情况下最关键的问题。幸运的是,我为你提供了最好的解决方案。所以我将帮助你把你的Laravel应用程序连接到MongoDB数据库。所以首先, 你需要进入这个链接.我假设你使用的是Windows。
现在, 我使用的是Windows 10 32Bit操作系统, 而我的PHP版本是7.1.所以你要根据你的机器配置来选择下载文件。
下载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适用于集合。因此, 我们将有一个collection变量。
另外,必须注意的是,主键不能通过**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,我可以给你一些提示。
- 把你的SQL迁移移到migrations文件夹里面的一个文件夹。我把它叫做MySQL。
- 所有使用默认数据库驱动的模型都应该扩展正确的模型。
对于默认驱动,运行迁移应该针对本地或生产(即当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');
}
第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,** 你可以看到如下图所示的页面。
第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');
}
第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次的写入和读取,合在一起。
我不建议用它来做缓存--无论何时你想做缓存,记得使用内存而不是磁盘,因为它能提供更少的摩擦,更快的访问和写入。



