Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库的互动。 每个数据库表会和一个对应的「模型」互动。
组件说明
业务侧还在用PHP5.3,composer.json文件内容如下:
{
"require": {
"illuminate/database": "4.1.*",
"jenssegers/mongodb": "1.3.*"
}
}
实际安装的版本如下。
使用方式:
配置文件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;