denchikby / phalcon-mongodb-odm
Phalcon MongoDB ODM
Requires
- ext-mongodb: *
- mongodb/mongodb: ^1.0
Requires (Dev)
- phalcon/devtools: ^3.2
This package is not auto-updated.
Last update: 2024-09-28 18:58:40 UTC
README
这是一个专为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);