thinkphp5.1中mongodb的使用测试

3 篇文章 0 订阅

环境:lnmp

框架:thinkphp5.1


数据库配置文件:

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

return [
    // 数据库类型
    'type'            => '\think\mongo\Connection',
    // 服务器地址
    'hostname'        => '127.0.0.1',
    // 数据库名
    'database'        => 'mytest',
    // 用户名
    'username'        => '',
    // 密码
    'password'        => '',
    // 端口
    'hostport'        => '',
    // 连接dsn
    'dsn'             => '',
    // 数据库连接参数
    'params'          => [],
    // 数据库编码默认采用utf8
    'charset'         => 'utf8',
    // 数据库表前缀
    'prefix'          => '',
    // 数据库调试模式
    'debug'           => true,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy'          => 0,
    // 数据库读写是否分离 主从式有效
    'rw_separate'     => false,
    // 读写分离后 主服务器数量
    'master_num'      => 1,
    // 指定从服务器序号
    'slave_no'        => '',
    // 是否严格检查字段是否存在
    'fields_strict'   => true,
    // 数据集返回类型
    'resultset_type'  => 'array',
    // 自动写入时间戳字段
    'auto_timestamp'  => false,
    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',
    // 是否需要进行SQL性能分析
    'sql_explain'     => false,
    // Query类
    'query'           => '\think\mongo\Query',
//    'pk_convert_id'  => true,
];


控制器代码:

<?php
/**
 * Class Test
 * decription  tp5中mongodb操作测试类
 * author  mn
 * version 1.0
 * date 2018/3/5
 */
namespace app\index\controller;

use think\Controller;
use app\index\model\user;
use app\index\model\info;
class Test extends Controller
{

    //新增数据测试  可直接使用tp的方法新增数据,但是一次只能插入一条数据(很奇怪,感觉应该是bug,所以在后边写了批量插入的方法)。
    public function add(){
        $model = new user;
        $uid = $model->seq();
        var_dump($model->add(['uid'=>$uid,'name'=>'asdfasf','arr'=>[['a'=>'aaa','b'=>'bbb']]]));
    }

    //批量插入测试
    public function insertMany(){
        $model = new user;
        $data = [];
        $arr = [];
        for($i=0;$i<3;$i++){
            $uid = $model->seq();
            $data[] = ['uid'=>$uid,'name'=>'name'.$i,'age'=>10+$i,'addr'=>'叽里呱啦'.$i,'arr'=>[
                ['class'=>'class'.$i,'level'=>$i+2,'common'=>'abcd'.$i],
                ['class'=>'class'.($i+1),'level'=>$i+3,'common'=>'abcd'.($i+1)],
                ['class'=>'class'.($i+2),'level'=>$i+2,'common'=>'abcd'.($i+2)]
            ]];
        }

        var_dump($model->insertMany($data));

    }

    //批量插入测试
    public function insertInfo(){
//        phpinfo();die;
        $model = new info;
        $arr = [];
        for($i=0;$i<10;$i++){
            $arr[] = ['uid'=>$i+1,'money'=>1000+$i,'bank'=>'beijing'.$i,'photo'=>'/public/photo/'.$i];
        }

        var_dump($model->insertMany($arr));

    }

    //查询测试  经测试,tp的链式查询完美支持mongodb
    public function getList(){
        $model = new user;
//        $list = $model->pageList([['age','>',11]],['uid'=>-1],2,3);
        $list = $model->pageList([['uid','=',11],['arr.level','=',3]],['uid'=>-1],0,5);
        var_dump($list);
    }

    //修改测试  支持普通修改,支持对数组中的文档进行 $ 更新操作
    public function update(){
        $model = new user;
        $data = ['arr.$.a'=>'class11111'];
        $where = [['uid','=',11]];
        $res = $model->updateU($data,$where);
        var_dump($res);
    }

    //修改测试,针对数组中的文档进行$push $pull操作,完美支持
    public function updateO(){
        $model = new user;
//        $data = ['arr'=>['$pull',['a'=>'aaa1']]];
        $data = ['arr'=>['$push',['a'=>'aaa1','b'=>'bbb1']]];
        $where = [['uid','=',11]];
        $res = $model->updateU($data,$where);
        var_dump($res);
    }

}

数据库模型类:

<?php
/**
 * Class  user
 * decription  user表模型类
 * author  mn
 * version 1.0
 * date 2018/3/5
 */
namespace app\index\model;
use think\Exception;
use think\Model;
use MongoDB\Driver\Command;
use MongoDB\Driver\BulkWrite;
class user extends Model
{
    protected $table = 'user';
    public function __construct($data = [])
    {
        parent::__construct($data);
    }
/*
    public function info(){
        return $this->hasOne('info','uid');
    }

    public function setEagerlyType(){
        return 0;
    }

    public function testRelation(){
       return $this->where([['uid','=',1]])->info()->select();
    }*/

    //添加
    public function add($data)
    {
        return $this->save($data);
    }

    //更新
    public function updateU($data,$where=[]){
        return $this->save($data,$where);
    }

    //批量插入
    public function insertMany($data){

        try{
            $bulkObj = new BulkWrite();
            foreach($data as $k=>$v){
                $bulkObj->insert($v);
            }
            $this->execute($this->table,$bulkObj);
            return true;

        }catch(Exception $e){
            var_dump($e->getMessage());
            return false;
        }
    }


    //查询操作
    public function pageList($where,$order,$skip,$limit){
        $list = $this->where($where)->order($order)->limit($skip,$limit)->select();
        return $list;
    }


    /*
     * 关联查询加分页 (tp5目前不支持mongodb使用join等链式方式进行关联查询,包括框架中的关联模型好像也不支持mongodb,所以这里只能通过原生的方法实现表的关联查询)
     *@param $lookup array 关联表信息 如:'$lookup'=>[
                        'from'=>'info',    关联表
                        'localField'=>'uid',  主表关联字段
                        'foreignField'=>'uid',  副表关联字段
                        'as'=>'joinData', 数据集名称
                    ],
     *@param $where array 条件
     *@param $sort array 排序
     *@param $skip int 跳过条数
     *@param $limit int 限制条数
     * */
    public function joinSelect($lookup,$where,$sort,$skip,$limit)
    {
        $cmd = [
            'aggregate'=>$this->table,
            'pipeline'=>[
                [
                    '$lookup'=>$lookup,
                ],
                [
                    '$match'=>$where,
                ],
                [
                    '$sort'=>$sort,
                ],
                [
                    '$skip'=>$skip,
                ],
                [
                    '$limit'=>$limit,
                ],

            ],
            'explain'=>false,

        ];
        $cmdObj = new Command($cmd);
        $res = $this->command($cmdObj);
        return $res;
    }



    /*
     * group分组查询 (tp5同样不支持group链式操作,此处还是使用原生查询)
     * @param array $group 分组规则 如:'$group'=>[
                                                    '_id'=>['sex'=>'$sex'],  //分组条件
                                                    'ageSum'=>['$sum'=>'$age'],  //要得到的聚合数据
                                                ]
     *
     *
     * */
    public function groupSelect($group){
        $cmd = [
            'aggregate'=>$this->table,
            'pipeline'=>[
                [
                    '$group'=>$group,
                ],

            ],
            'explain'=>false,

        ];
        $cmdObj = new Command($cmd);
        $res = $this->command($cmdObj);
        return $res;
    }


    //获取自增id   (mongodb中没有类似MySQL中的自增ID,需要自己实现,这里通过一个集合来维护所有的自增ID)
    public function seq($id = 'uid'){
        $cmd = array(
            'findandmodify' => 'sequences',
            'query' => array('_id' => $id),
            'update' => array('$inc' => array('val' => 1)), //更新
            'new' => true,
            'upsert' => true
        );
        $cmdObj = new Command($cmd);
        $res = $this->command($cmdObj);
         return $res[0]['value']['val'];
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ThinkPHP 5.1 可以使用 Workerman 实现实时推送功能,具体实现步骤如下: 1. 安装 Workerman 可以使用 Composer 安装 Workerman: ``` composer require workerman/workerman ``` 2. 创建 Workerman 控制器 在应用的 controller 目录下创建 Workerman 控制器,例如创建 `Push.php`,并在该控制器实现推送功能: ```php namespace app\controller; use think\worker\Server; class Push extends Server { // 监听的地址和端口号 protected $socket = 'websocket://0.0.0.0:2346'; // 接收到客户端消息时触发 public function onMessage($connection, $data) { // 将客户端发送的消息广播给所有客户端 foreach ($this->worker->connections as $conn) { $conn->send($data); } } } ``` 3. 在路由定义 Workerman 路由 在 `route` 目录下的 `route.php` 文件定义 Workerman 路由,例如: ```php use think\facade\Route; // 定义 Workerman 路由 Route::get('push', 'push/index'); ``` 4. 启动 Workerman 服务 在命令行使用以下命令启动 Workerman 服务: ``` php think worker:server ``` 5. 在页面调用推送接口 在需要推送消息的页面,调用推送接口,例如: ```javascript var ws = new WebSocket('ws://localhost:2346'); ws.onopen = function() { ws.send('Hello, Workerman!'); }; ws.onmessage = function(event) { console.log(event.data); }; ``` 以上就是使用 ThinkPHP 5.1 实现 Workerman 的推送功能的步骤。需要注意的是,在使用 Workerman 时需要开启 PHP 的长连接,因此需要使用 CLI 环境运行 PHP。此外,需要在浏览器测试推送功能时,需要使用支持 WebSocket 的浏览器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值