不败君

前端萌新&初级后端攻城狮

Laravel 使用 MongoDB 数据库

Laravel 使用 MongoDB 数据库

2021-02-07 18:25:17

围观(4999)

在使用 MongoDB 前,需要开启 PHP 的 MongoDB 扩展。

具体如何开启:https://www.php.net/manual/en/mongodb.installation.php


本文使用 jenssegers/mongodb https://github.com/jenssegers/laravel-mongodb 的包,进行使用 MongoDB。

使用的是 Laravel 7.* 使用命令安装(如果其他版本的 Laravel 可以查阅上面的 jenssegers/mongodb 包文档):

composer require jenssegers/mongodb="3.7.x"


在 config/database.php 的数组 connections 添加配置:

'mongodb' => [
    'driver' => 'mongodb',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', 27017),
    'database' => env('DB_DATABASE', 'homestead'),
    'username' => env('DB_USERNAME', 'homestead'),
    'password' => env('DB_PASSWORD', 'secret'),
    'options' => [
        'database' => env('DB_AUTHENTICATION_DATABASE', 'admin'), // required with Mongo 3+
    ],
],


在 .ENV 配置:

DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=collection
DB_USERNAME=
DB_PASSWORD=

这里的数据库 DB_DATABASE 其实是 MongoDB 的集合。


在 app 下创建一个 MongoDB 目录(存放 MongoDB 的 Model 可以取其他名称).

在 app/MongoDB 创建一个 Content 类。

Content 类继承 Jenssegers\Mongodb\Eloquent\Model 例如:

<?php
namespace App\MongoDB;

use Jenssegers\Mongodb\Eloquent\Model;

class Content extends Model
{
    protected $collection = 'content';  // 这里可以不定义 也可以定义

    protected $fillable = [
        'name', 'content', 'created_at', 'updated_at'
    ];
}

相关的可以查看 jenssegers/mongodb 的文档。


最后进行 CRUD 测试,创建一个 IndexController 控制器,并在路由调用 test 方法(本文不描述如何创建控制器和使用路由 这些都是基础知识)。


插入数据:

public function test()
{
    Content::create([
        'title' => 'title',
        'content' => 'content'
    ]);
}


批量插入数据:

Content::insert([
    [
        'name' => 'name1',
        'content' => 'content1',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s')
    ],
    [
        'name' => 'name2',
        'content' => 'content2',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s')
    ]
]);


查询数据:

根据 _ID 主键查询:

public function test()
{
    $row = Content::find('601f540f573e0000490017eb');
    dd($row);
}

这个包的实现,其实是先继承了 Eloquent 然后重写一些方法,所以在使用上和 Laravel 使用 MySQL 基本上一致。就不继续写修改和删除的方法了。


同时使用 MySQL 和 MongoDB

MySQL 是关系型数据库,MongoDB 其实是 NoSQL 数据库,在某些应用场景 MongoDB 更加适用性能也更好,所以同时使用这两种数据库的情况并不少见。


先是修改.ENV 配置:

DB_CONNECTION=mongodb

# 下面的是 MySQL 的配置
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=root
DB_PASSWORD=root

# 下面的是 MongoDB 的配置
MONGO_DB_HOST=127.0.0.1
MONGO_DB_PORT=27017
MONGO_DB_DATABASE=collection
MONGO_DB_USERNAME=
MONGO_DB_PASSWORD=

修改数据库驱动配置 config/database.php 的 connections 数组的 mongodb:

'mongodb' => [
    'driver' => 'mongodb',
    'host' => env('MONGO_DB_HOST', '127.0.0.1'),
    'port' => env('MONGO_DB_PORT', 27017),
    'database' => env('MONGO_DB_DATABASE', 'homestead'),
    'username' => env('MONGO_DB_USERNAME', 'homestead'),
    'password' => env('MONGO_DB_PASSWORD', 'secret'),
    'options' => [
        'database' => env('DB_AUTHENTICATION_DATABASE', 'admin'), // required with Mongo 3+
    ],
],

在使用 MongoDB 时可以继续使用上文写的,不会有影响。

在使用 MySQL 时,需要在对应的 Model 上加入 $connection 属性并指定值为 MySQL,例如:

<?php
namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $connection = 'mysql';
}

此时可以使用不同的 Model 访问 MySQL 或 MongoDB 数据库。

本文地址 : bubaijun.com/page.php?id=230

版权声明 : 未经允许禁止转载!

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语