在 hyperf 中使用 MongoDB

liyuzhao5年前开发项目遇到的问题3124

欢迎使用 phper666/mongo-db,地址:

https://github.com/phper666/mongo-db

1、默认使用mongodb提供的库来封装,官方git地址:https://github.com/mongodb/mongo-php-library

2、支持类似mysql orm的一些操作

3、支持迁移文件

4、只支持hyperf框架,由于swoole协程不支持mongodb,所以所有的方法都采用task进程来实现,该包已经封装好所有的方法都会投递到task进程进行操作,task进程建议开启多一点

5、该包默认使用了连接池


1、拉取包

composer require phper666/mongo-db

2、发布配置

php bin/hyperf.php mongodb:publish --config

3、配置介绍

<?php
	declare(strict_types=1);
	return [
		'default' => [
			'username' => env('MONGODB_USERNAME', ''),  // mongodb用户名
			'password' => env('MONGODB_PASSWORD', ''), // mongodb密码
			'host' => env('MONGODB_HOST', '127.0.0.1'), // mongodb host
			'port' => env('MONGODB_PORT', 27017),
			'db' => env('MONGODB_DB', 'test'), // mongodb库名
			'authMechanism' => env('MONGODB_AUTH_MECHANISM', 'SCRAM-SHA-256'), // 认证的方式
			'driver_options' => [], // 驱动配置
			'migration' => [
				'path' => BASE_PATH . '/migrations/mongodb', // 迁移文件的路径
			],
			//设置复制集,没有不设置
	//        'replica' => 'rs0',
			'pool' => [ // 连接池的一些配置
				'min_connections' => 1,
				'max_connections' => 100,
				'connect_timeout' => 10.0,
				'wait_timeout' => 3.0,
				'heartbeat' => -1,
				'max_idle_time' => (float)env('MONGODB_MAX_IDLE_TIME', 60),
			],
		],
	];

4、生成迁移文件

php bin/hyperf.php mongodb:migrate Test

上面的命令会自动生成一个迁移文件,会生成一个文件到配置文件指定的迁移目录中

5、迁移文件例子

<?php
	declare(strict_types=1);
	namespace Phper666\MongoDb\Example\Migrations;
	use Phper666\MongoDb\MongoDbMigration;
	class CreateTestCollection extends MongoDbMigration
	{
		/**
		 * 支持很多方法,请详细去看MongoDbMigration这个类
		 * @throws \Phper666\MongoDb\Exception\MongoDBException
		 */
		public function up()
		{
			$msg = [];
			$msg[] = $this->createCollection('test'); // 创建一个表
			$data = [
				['dd' => 1, 'tt' => 2],
				['dd' => 2, 'tt' => 4],
			];
			$msg[] = $this->insertMany('test', $data); // 插入多条数据
			$msg[] = $this->createIndex('test', ['dd' => 1, 'tt' => 1]); // 在该表上创建索引
			$msg[] = $this->createIndexes('test', [['dd' => 1], ['tt' => 1]]); // 在该表上批量创建索引
			$msg[] = $this->dropCollection('test'); // 删除一个表
			return $msg;
		}
		/**
		 * 迁移失败时会执行
		 * @throws \Phper666\MongoDb\Exception\MongoDBException
		 */
		public function down()
		{
			return 'error';
		}
	}

6、迁移命令

php bin/hyperf.php mongodb:migration

上面这个命令会迁移你所有生成的文件,迁移文件路径在配置文件里面配置

7、开发使用

7.1上面能像orm一样能进行迁移了,解决了升级的问题,下面我们来说一下开发时候怎么使用

7.2 在你的项目里面新建一个目录,该目录叫mongo(自行命名,类似orm的model)

7.3 比如我现在项目里面有一个库,叫test,test里面有两个collection,名字为co1,co2(你把它当成mysql的表一样)

7.4 我在mongo目录新建两个文件,叫Co1Mongo和Co2Mongo,都继承\Phper666\MongoDb\MongoDb,例子如下:

<?php
	declare(strict_types=1);
	namespace TmgAddons\WebQySession\Admin\Mongo;
	use Phper666\MongoDb\MongoDb;
	class TestMongo extends MongoDb
	{
		/**
		 * mongodb表
		 * @var null
		 */
		public $collectionName = 'co1';
	}
	
	7.5 查询co1中的一条数据,例子如下:
	<?php
	declare(strict_types=1);
	namespace TmgAddons\WebQySession\Admin\Controller;
	use Hyperf\Di\Annotation\Inject;
	use Hyperf\HttpServer\Annotation\Controller;
	use Hyperf\HttpServer\Annotation\GetMapping;
	use TmgAddons\WebQySession\Admin\Mongo\Co1Mongo;
	/**
	 * @Controller(prefix="/test")
	 * Class TestController
	 * @package TmgAddons\WebQySession\Admin\Controller
	 */
	class TestController
	{
		/**
		 * @Inject()
		 * @var Co1Mongo
		 */
		private $co1Mongo;
		/**
		 * @GetMapping(path="")
		 * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) array
		 * @throws \Phper666\MongoDb\Exception\MongoDBException
		 */
		public function test()
		{
			// 调用test方法时,就能查出co1表中的一条数据了,是不是很简单!
			return response_success($this->co1Mongo->findOne());
		}
	}

7.6 支持有多种方法,详细你可以到Phper666\MongoDb\MongoDb查看,或者你可以去看官方的php-mongodb文档,https://docs.mongodb.com/php-library/v1.5/reference/method/MongoDBCollection-createIndexes/

8、结束

如果你有使用的问题或者建议,欢迎你提一个isset,由于太匆忙,等我开发完现在的项目,我会重新优化和迭代这个包,如果开发中有遇到问题或者有更好的写法,我会迭代到这个包这里。

9、注意

1、如果你使用的是mongodb默认生成_id,那么更新和删除我默认已经帮你使用MongoDB\BSON\ObjectId进行了转换,所以你无需再转换,你直接把_id对应的字符串传进去就好了,比如要根据_id获取某条数据,$filter=['_id' => 'xxxxxx']即可。获取数据时,我也默认帮你把_id转成了字符串   

2、由于我这边开发时间比较紧急,有很多东西尚未完善,后期会迭代


**使用过程中有遇到问题,欢迎提isset**


相关文章

php的数据库连接单例模式思考

最近在做一个客服聊天的插件,无意中考虑到数据库使用单例模式的问题。我当时的疑问是: 数据库用了单例模式  每个用户去访问这个应用 这个单例模式的数据库资源是不是被每个用户共享的?&...

微擎模块更新问题!

最近公司用微擎来进行公众号开发,由我负责一个模块进行开发,里面出现了一些比较坑的问题,所以记录一下。我们公司这边有一个测试环境,我每次都是在测试环境测试通过后就git到码云中去。然后深圳那边的公司的人...

vue的axios的post跨域问题!

最近在学vue,用axios的post跨域请求api的时候出现了问题。后面查资料,发现是跨域请求是有区别的。一种是简单的跨域请求:get另一种是非简单的跨域请求:post put 等等 。请看http...

apache设置缓存

在配置文件输入ExpiresActive On    ExpiresDefault “access plus 30 days” 欢迎大家来校园淘物站的论坛玩玩哦...

hyperf 启动、重启、停止、文件变化监听命令包

鉴于hyperf1.1+还没有重启等命令,本地调试比较麻烦,所以使用了FanchangWang写的代码封装成了一个包,方便使用。该扩展包完全使用了FanchangWang写的代码,非常感谢Fancha...

mysql导入数据问题

最近用mysql5.7,数据弄好了导入到服务器上,却频繁的出错。具体分析了下错误,是因为服务器上的mysql版本比较低,有些功能不支持,我数据出错的主要原因是有些字段用了datatime类型,用了个自...

评论列表

1
2024-07-25 03:12:55

识别码:nofywl89562AR-这游戏真不错!http://www.a5km.com/yxgl/dnf/25698.html

11
2024-07-25 03:13:41

识别码:ajnbxw70162TM-这游戏真不错!http://www.a5km.com/yxgl/jdqs/28239.html

1
2024-07-25 23:09:11

识别码:vgzadx35217KJ-您的文笔细腻,描写细致,让人仿佛亲身经历了文中的事件。https://www.kaimenhongzs.com/

111111
2024-08-08 00:29:51

识别码:cxnemp40912CU-这游戏真不错!http://www.a5km.com/yxgl/jdqs/28259.html

111
2024-08-08 10:00:40

识别码:jwqlis51964SX-这游戏真不错!http://www.a5km.com/yxgl/jdqs/27753.html

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。