denchikby/phalcon-mongodb-odm

Phalcon MongoDB ODM

v1.0.6 2017-07-06 15:56 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:58:40 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

这是一个专为Phalcon框架和新的mongodb php扩展设计的,小巧、简单且功能齐全的MongoDB ODM库

安装

请确保您已安装MongoDB PHP驱动程序。您可以在以下链接找到安装说明:[https://php.ac.cn/manual/en/mongodb.installation.php](https://php.ac.cn/manual/en/mongodb.installation.php)

使用composer安装最新稳定版本

composer require denchikby/phalcon-mongodb-odm

{
    "require": {
        "denchikby/phalcon-mongodb-odm": "dev-master"
    }
}

配置

添加设置和服务到DI

$di->set('config', function () {
    return new \Phalcon\Config([
        'mongodb' => [
            'host'     => 'localhost',
            'port'     => 27017,
            'database' => 'auto'
        ]
    ]);
}, true);

$di->set('mongo', function () use ($di) {
    $config  = $di->get('config')->mongodb;
    $manager = new \MongoDB\Driver\Manager('mongodb://' . $config->host . ':' . $config->port);
    return $manager;
}, true);

创建模型

use DenchikBY\MongoDB\Model;

class User extends Model {}

在这种情况下,将使用与模型同名的'user'集合。

要指定另一个集合名称,请使用getSource方法

use DenchikBY\MongoDB\Model;

class User extends Model
{
    public static function getSource()
    {
        return 'users';
    }
}

初始化模型

要初始化一个新的模型而不是

$user = new User;

使用

$user = User::init();

初始化填充的模型

$user = User::init(['name' => 'DenchikBY']);

$user = User::init()->fill(['name' => 'DenchikBY']);

或初始化并保存到数据库

$user = User::create(['name' => 'DenchikBY']);

方法

转换为数组

$ad = Ads::init()->first();
var_dump($ad->toArray()); // array of all fields
var_dump($ad->toArray(['include' => ['id', 'name']])); // array of specified fields
var_dump($ad->toArray(['exclude' => ['user_id']])); // array of all fields except specified

取消设置字段

$ad = Ads::init()->first();
$ad->unsetField('counters.views');

属性类型转换

允许您在设置/填充时修改属性类型

它有助于将字段以所需类型保存到数据库中,这对于MongoDB在查询中不进行类型转换非常重要。

支持的类型:整数、浮点数、布尔值、字符串、数组、对象、id

class User extends Model
{
    protected static $casts = [
        'age' => 'integer'
    ];
}

$user->age = '20';

var_dump($user->age); => int(20)

类型转换也适用于构建器的where方法

User::where('age', '20')->get();

年龄将被转换为整数,查询将正常加载。

关系

有两种类型的关系:一对一和多对多;

定义

字段 => [相关模型,类型,本地字段,外键字段]

public static $relations = [
    'user'     => [Users::class, 'one', 'user_id', '_id'],
    'comments' => [Comments::class, 'many', '_id', 'ad_id']
];

关系可以通过两种方式加载

通过一个查询

Ads::where('views', '>', 1000)->join('user')->join('comments')->get()

它将使用聚合框架的$lookup运算符。

通过多个查询,只需调用具有关系数组中键名的属性

$user = User::where('name', 'DenchikBY')->first();
var_dump($user->comments);

作用域

作用域有助于将常用查询放入方法中

/**
 * @method $this active()
 */
class BaseModel extends Model
{
    public scopeActive($builder)
    {
        return $builder->where('active', 1);
    }
}

$users = User::active()->get();
$ads   = Ads::active()->get();

全局作用域

此作用域将绑定到模型的任何查询

class Ads extends Model
{
    public static $globalScopes = ['notDeleted'];
    
    public function notDeleted($builder)
    {
        return $builder->where('deleted', 0);
    }
}

修改器(获取器/设置器)

修改器允许在获取、设置或填充属性时修改属性。

例如,当您创建用户并设置密码时,散列可能在模型中定义

$user = User::create([
    'name'     => 'DenchikBY',
    'password' => '1234'
]);
class User extends Model
{
    public function getName($value)
    {
        return ucfirst($value);
    }

    public function setPassword($value)
    {
        return Di::getDefault()->get('security')->hash($value);
    }
}

事件

存在用于保存、创建、更新、删除操作之前/之后的事件。

class User extends Model
{
    public function afterCreate()
    {
        Email::send($this->email, 'emails.succeddfull_registration', ['user' => $this]);
    }
}

查询构建器

查询构建器可以明确或隐式调用。

$users = User::query()->get();

相似

$users = User::get();

用法

$builder = User::query();

//allowed operators in where =, !=, >, <, >=, <=

$builder->where('name', '=', 'DenchikBY');
//similar
$builder->where('name', 'DenchikBY');

$builder->orWhere('name', 'Denis');

$builder->betweenWhere('age', 20, 30);

$builder->notBetweenWhere('age', 20, 30);

$builder->inWhere('name', ['DenchikBY', 'Denis']);

$builder->notInWhere('name', ['DenchikBY', 'Denis']);

$builder->orderBy('created_at', 'desc');

$builder->limit(2, 1);

//Closing methods:

$users = $builder->get(); // return collection of models

$user = $builder->first(); // return first model without collection

$count = $builder->count(); // run count command, which return int of counted documents

$count = $builder->increment('coins', 10); // increase field in founded documents, return count of them

$count = $builder->decrement('coins', 10);

$count = $builder->update(['banned' => 1]); // update founded documents with specified fields, return count of them

$count = $builder->delete(); // delete founded documents, return count of them

$age = $builder->max('age');

$age = $builder->min('age');

$age = $builder->avg('age');

$total = $builder->sum('age');

$builder->unsetField('counters.views');

高级where条件

用于分组where条件

$query = Ads::query()->where('auto_id', '567153ea43946846683e77ff')->where(function (Builder $query) {
    $query->where('body', 1)->orWhere('capacity', 2);
});

查询结果集合

每个select查询都将返回模型迭代集合类。

$collection = Comments::where('ad_id', new \MongoDB\BSON\ObjectId($id))->get();

它可以用foreach迭代,或者作为数组$collection[0]->name使用

方法

集合大小

$collection->count();

将返回每个模型的关联数组

$collection->toArray();

通过toArray方法创建的数组json返回

$collection->toJson();

懒加载,类似于连接

通过单个查询加载所有评论,并将其放入每个文档中。

$collection->eager(Users::class, 'user', 'user_id', '_id');

按特定字段将文档分组到数组中

$collection->groupBy('user');

按给定键对集合进行键控(与groupBy不同,groupBy中的值将是单个模型,在groupBy中是模型数组)

$collection->keyBy('user');

返回集合特定字段的值数组

$collection->pluck('user_id');

返回指定键=>值字段的关联数组

$collection->combine('_id', 'text');

返回指定大小的分块集合数组

$collection->chunk(10);