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

file

安装完成后,在命令行执行 mongo 就可以进入 Mongodb 。

$ sudo service mongod start
$ mongo

file

需要创建一个用户,用户名叫 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

file

需要配置一下数据库:

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

file

我们创建了一个叫 test 的集合,插入了一条记录,字段 foo 的值为 bar。进入 mongodb 查询一下这个数据,使用 db.test.find();:

file

我们不需要创建表,也不需要指定表结构,直接就可以使用了。删除刚才的测试数据:

db.test.drop();

file

使用 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 完成登录注册的逻辑。

打开项目,随便注册一个用户。
file

在命令行执行 mongo 进入 Mongodb,查看一下数据表:

use package;
db.users.find();

file

数据保存正常,功能也可以正确使用了。

代码版本控制

$ git add -A
$ git commit -m 'jenssegers/mongodb'

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
贡献者:1