Laravel8 使用mongo数据库
安装
1. 确保电脑上装好mongo数据库
本篇文章使用的是version 4.0.27, 安装步骤此处不再赘述
2. 执行 composer require jenssegers/mongodb 安装拓展
3. 定义模型数据库
下面定义一些测试模型
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Factories\HasFactory;
// 如果使用DB查询, 那么就继承这个类, 但是不是很好用, 排序方法不好用
//use Moloquent;
// 下面这个类不支持laravel7 支持6 8 9
use Jenssegers\Mongodb\Eloquent\Model;
class Address extends Model
{
use HasFactory, HasDateTimeFormatter;
protected $connection = 'mongodb';
protected $table = 'address';
/***
* 白名单
* @var string[]
*/
protected $fillable = ['number', 'name', 'address','phone'];
/**
* @var string
*/
protected $primaryKey = '_id'; //设置id
/**
* 指定是否模型应该被戳记时间。
*
* @var bool
*/
public $timestamps = false;
protected $dates = ['ctime'];
public function users()
{
return $this->belongsTo(Users::class,'user_id');
}
public function getAttribute($key)
{
return parent::getAttribute($key); // TODO: Change the autogenerated stub
}
}
4. 定义service层
<?php
namespace App\Services;
use App\Models\Address;
use Illuminate\Support\Facades\DB;
use Think\Exception;
class AddressService
{
public $db;
public $_addressModel;
public function __construct(Address $_addressModel)
{
$this->db = DB::connection('mongodb');
$this->_addressModel = $_addressModel;
}
/**
* 列表
* @param int $limit
* @param int $skip
* @param array $field 按照最后一个字段排序
* @param array $where where条件
* @param int $options 0 升序 | -1 降序
* @param bool $descending 默认false | true 降序
* @return array
*/
public function list($whereIn, $where, $field, $options, $descending, int $page = 1, int $pagesize = 20)
{
// 分组查询
$group = '';
$page = $page <= 0 ? 1 : $page;
//限制一页获取最大条数
if ($pagesize <= 0 or $pagesize > 14) {
$pagesize = 14;
}
//计算总页数
$total = $this->_addressModel->count();
$totalPage = ceil($total / $pagesize);
if ($where) {
if ($where['number'] && isset($where['number'])) {
$this->_addressModel = $this->_addressModel->where('number',$where['number'][0],$where['number'][1]);
}
if ($where['ctime'] && isset($where['ctime'])) {
$this->_addressModel = $this->_addressModel->where('ctime',$where['ctime'][0],$where['ctime'][1]);
}
if ($where['address'] && isset($where['address'])) {
$this->_addressModel = $this->_addressModel->