让Lavarel Eloquent ORM 支持 mongodb数据库
Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库的互动。 每个数据库表会和一个对应的「模型」互动。
组件说明
业务侧还在用PHP5.3,composer.json文件内容如下:
{
"require": {
"illuminate/database": "4.1.*",
"jenssegers/mongodb": "1.3.*"
}
}
实际安装的版本如下。
组件 | 版本 |
---|---|
illuminate/database | v4.1.30 |
jenssegers/laravel-mongodb | v1.3.2 |
使用方式:
配置文件conf/database.php新增mongodb配置。
<?php $database = array( 'mongodb' => array( 'driver' => 'mongodb', 'host' => '100.98.173.13', 'port' => 5566, 'database' => 'bigdata', ), )
自动加载数据库,新增mongodb数据库类型。
include conf/database.php; $capsule = new Capsule; // 支持mongodb数据库,如果name是mongodb,交给Jenssegers\Mongodb\Connection来处理 $capsule->getDatabaseManager()->extend('mongodb', function($config) { return new Jenssegers\Mongodb\Connection($config); }); foreach ($database[$env] as $name => $conf) { // 创建链接 $capsule->addConnection($conf, $name); } // 设置全局静态可访问 $capsule->setAsGlobal(); // 启动Eloquent $capsule->bootEloquent();
model继承
Jenssegers\Mongodb\Model
.<?php class UserModel extends Jenssegers\Mongodb\Model { /** * table * * @var string */ protected $table = 'users'; /** * connection * * @var string */ protected $connection = 'mongodb'; }
上面是按网上找到的资料配置的,然后跑起来后报PHP Fatal error: Call to a member function connection() on a non-object in /web/xxx/vendor/illuminate/database/Illuminate/Database/Eloquent/Model.php on line 2810
的错误。
断点定位了半天,才解决掉问题,这里记录一下。
先看下2810行的代码是什么。
2808 public static function resolveConnection($connection = null)
2809 {
2810 return static::$resolver->connection($connection);
2811 }
注意这里用的是static::$resolver
,关于php的static和self的区别可以参考这篇文章,这里不做过多描述。
php中self与static的区别
解决方法:
修改vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Model.php
文件,注释下面这行代码。
protected static $resolver;