038. 快速接入 Mongodb——jenssegers/mongodb (基础篇)
快速接入 Mongodb——jenssegers/mongodb (基础篇)
Mongodb 是一个基于分布式文件存储的数据库,是当前 noSql 数据库产品中最热门的一个,你的项目中也很可能需要接入 Mongodb 完成一些业务。这节课我们要使用的扩展包 jenssegers/mongodb 就可以非常方便的帮助我们接入 Mongodb。
这节课我们快速的安装并配置一下 Mongodb,通过扩展包快速接入,能够开始正常使用 Mongodb。这节课是一个基础课程,如果你有想要学习的 Mongodb 使用尝尽或者好的场景建议,可以在下方进行回复。
安装
我们需要安装的是 Mongodb 以及 PHP 的 Mongodb 扩展 。
使用 Homestead 的方式安装
如果你使用了 Homestead ,可以快速完成安装,查看文档中关于 安装 Mongodb 的部分,你会发现其实只需要修改一下配置,增加 mongodb: true
然后重新启动 Homestead 就可以完成 Mongodb 的安装。
~/Homestead/Homestead.yaml
mongodb: true
最后重新加载配置,然后重启 Homestead。
vagrant reload --provision
如果你的网络环境没有问题,那么应该可以正常使用了。不过 Homestead 安装的依然是 Mongodb 3.6 的版本,2018 年初,4.0 版本的 Mongodb 已经发布了,加入了事务的功能,如果你想使用 4.0 版本,那么就需要手动安装一下 Mongodb 了。
手动安装 Mongodb
这节课我们主要演示手动安装的方式,这样在其他的环境中,或者你有一个自己的服务器,那么安装起来也应该会得心应手。
docs.mongodb.com/manual/tutorial/i...
$ cat /etc/issue
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
可以通过
cat /etc/issue
命令查看你的 ubuntu 版本,域名解析有问题可以使用sudo echo nameserver 8.8.8.8 > /etc/resolv.conf
安装完成后,在命令行执行 mongo
就可以进入 Mongodb 。
$ sudo service mongod start
$ mongo
需要创建一个用户,用户名叫 homestead,密码是 secret, 角色是超级管理员 root。
use admin;
db.createUser({user:'homestead',pwd:'secret',roles:['root']})
PHP 扩展
Mongodb 的扩展安装起来非常方便,只需要执行:
$ sudo apt-get install php-mongodb
可以使用 php -m | grep mongodb
确定一下是否安装成功。
为了避免一些问起,记得重启一下 php-fpm,使用
sudo service php7.2-fpm restart
。
安装扩展包
$ composer require jenssegers/mongodb:~3.3.0
需要配置一下数据库:
config/database.php
.
.
.
'connections' => [
.
.
.
'mongodb' => [
'driver' => 'mongodb',
'host' => env('MONGODB_HOST', 'localhost'),
'port' => env('MONGODB_PORT', 27017),
'database' => env('MONGODB_DATABASE'),
'username' => env('MONGODB_USERNAME'),
'password' => env('MONGODB_PASSWORD'),
'options' => [
'database' => 'admin' // sets the authentication database required by mongo 3
]
],
.
.
.
我们添加了几个 MONGODB_
开头的变量,可以配置到 env 中,同 mysql 一样,需要配置账号密码,以及使用的数据库。
.env
.
.
.
MONGODB_DATABASE=package
MONGODB_USERNAME=homestead
MONGODB_PASSWORD=secret
.
.
.
默认使用的数据库是 package,用户名和密码是刚才创建的 homestead。
使用
直接使用 DB
直接使用 DB::connection('mongodb')
就可以直接操作 mongodb 了,打开 tinker 测试一下
DB::connection('mongodb')->collection('test')->insert(['foo'=>'bar']);
我们创建了一个叫 test 的集合,插入了一条记录,字段 foo
的值为 bar
。进入 mongodb 查询一下这个数据,使用 db.test.find();
:
我们不需要创建表,也不需要指定表结构,直接就可以使用了。删除刚才的测试数据:
db.test.drop();
使用 ORM
在 ORM 中使用需要继承扩展包提供的类 Jenssegers\Mongodb\Eloquent\Model
,比如修改一下 User 模型。
对于一般的模型直接继承就好了,但是 User 模型继承的是 Illuminate\Foundation\Auth\User
有一些关于用户认证内容,这样直接继承会有问题,不过放心,扩展包同样为 User 提供了一个类 Jenssegers\Mongodb\Auth\User
,继承这个类即可。
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
//use Illuminate\Foundation\Auth\User as Authenticatable;
use Jenssegers\Mongodb\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
protected $connection = 'mongodb';
.
.
.
因为默认我们链接的还是 mysql,所有参数验证的地方还需要再修改一下:
app/Http/Controllers/Auth/RegisterController.php
.
.
.
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:mongodb.users',
'password' => 'required|string|min:6|confirmed',
]);
}
.
.
.
注意 unique:mongodb.users
这里,可以指定验证 mongodb 中的用户。
现在 User 数据已经可以正常保存在 Mongodb 中了,我们注册一个用户测试一下,使用 make:auth
完成登录注册的逻辑。
打开项目,随便注册一个用户。
在命令行执行 mongo
进入 Mongodb,查看一下数据表:
use package;
db.users.find();
数据保存正常,功能也可以正确使用了。
代码版本控制
$ git add -A
$ git commit -m 'jenssegers/mongodb'