visavi / phpactiverecord
phpactiverecord 是一个基于 ActiveRecord 模式的开源 ORM 库。
Requires
- php: >=5.3.0
Requires (Dev)
- pear/log: ~1.12
- pear/pear_exception: 1.0-beta1
- phpunit/phpunit: 4.*
This package is auto-updated.
Last update: 2024-09-20 01:32:57 UTC
README
由于 phpactiverecord 发展非常缓慢,且不情愿接受 pull-request,即使对于重要的更改,我不得不创建自己的分支
在原始分支中,分支管理相当混乱,1.2 版本远远落后于 1.1 版本,而 1.1 版本又落后于主干
这个分支基于 1.1 版本,因为它提供了创建、修改或删除实体时创建自定义规则的能力
但我会尽量将主干分支中的更改也应用到这个分支中
差异
- 所有来自主干分支的修复,并跟踪其时效性
- 更方便的日志输出 - https://github.com/jpfuentes2/php-activerecord/pull/444/files
- 添加了用于处理 Memcached 的类
- 添加了类似 yii 1.1 的场景脚本,验证将只在特定的场景下触发
- 添加了对 UTF-8 字符串长度的检查,原始版本中的验证方法错误地确定了字符串长度
- 添加了新的验证方法 validates_existence_of,用于检查记录在表中的存在性
场景使用示例
####在模型中
static $validates_presence_of = [ ['reply', 'message' => 'Необходимо заполнить поле ответ', 'scenario' => 'reply'], ];
####在控制器中
$guest = new Guestbook(); $guest->scenario = 'reply'; $guest->text = 'Текст сообщения'; $guest->reply = 'Ответ'; $guest->save();
如果传递了属性 scenario = 场景名称,则数据验证将考虑该场景,否则将忽略验证规则
$guest = new Guestbook(); $guest->text = 'Текст сообщения'; $guest->save();
可以传递场景数组: 'scenario' => ['reply', 'answer']
validates_existence_of 验证使用示例
static $validates_existence_of = [ ['parent_id', 'in' => 'Category:id', 'presence' => true, 'allow_empty' => true, 'message' => 'Родительская категория не найдена'] ]; - in - указывает на модель:поле - presence - должна ли присутствовать запись или нет, по умолчанию true - allow_empty - разрешено ли передавать нулевое значение, если передан ноль, то валидация не срабатывает - message - пользовательское описание ошибки
日志视图
[info] 0.002s -- SHOW COLUMNS FROM `users` [июн 21 15:21:47]
[info] 0.001s -- SELECT * FROM `users` WHERE `id`='1' LIMIT 0,1 [июн 21 15:21:48]
[info] 0.001s -- SHOW COLUMNS FROM `forums` [июн 21 15:21:48]
[info] 0.001s -- SELECT * FROM `forums` WHERE parent_id = '0' ORDER BY sort [июн 21 15:21:48]
[info] 0.001s -- SHOW COLUMNS FROM `topics` [июн 21 15:21:48]
[info] 0.000s -- SELECT count(*) as count, forum_id FROM `topics` WHERE `forum_id` IN('1','2','3','4') GROUP BY forum_id [июн 21 15:21:48]
[info] 0.000s -- SELECT * FROM `forums` WHERE `parent_id` IN('1','2','3','4') ORDER BY sort DESC [июн 21 15:21:48]
[info] 0.001s -- SHOW COLUMNS FROM `posts` [июн 21 15:21:48]
[info] 0.001s -- SELECT count(*) as count, forum_id FROM `posts` WHERE `forum_id` IN('15','14','13','12','11','10','9','8','7','6','5') GROUP BY forum_id [июн 21 15:21:48]
[info] 0.000s -- SELECT count(*) as count, forum_id FROM `topics` WHERE `forum_id` IN('15','14','13','12','11','10','9','8','7','6','5') GROUP BY forum_id [июн 21 15:21:48]
[info] 0.000s -- SHOW COLUMNS FROM `topics` [июн 21 15:21:48]
[info] 0.000s -- SELECT * FROM `topics` WHERE `id` IN('7',NULL,NULL,NULL) [июн 21 15:21:48]
显示每个请求的执行时间,并将所有值插入占位符
简介
ActiveRecord 的简要概述
Active record 是一种访问数据库数据的方法。数据库表或视图被包装在一个类中,因此对象实例与表中的一行绑定。对象创建后,在保存时会在表中添加新行。加载的对象从数据库中获取其信息;当对象更新时,表中的对应行也会更新。包装类实现了对表或视图中的每一列的访问器方法或属性。
更多详细信息请参考 这里。
此实现受到 Ruby on Rails ActiveRecord 的启发,因此大量借鉴了其模式。我们尽量保持了它们的约定,但由于便利性或必要性而偏离了它们。当然,如果用户熟悉 rails,他们可能会注意到一些明显的差异。
最低要求
- PHP 5.3+
- 您的数据库的 PDO 驱动程序
支持的数据库
- MySQL
- SQLite
- PostgreSQL
- Oracle
功能
- 查找方法
- 动态查找方法
- 写入方法
- 关系
- 验证
- 回调
- 序列化(json/xml)
- 事务
- 支持多个适配器
- 其他选项,例如:别名/受保护/可访问属性
安装
设置非常简单直观。实际上,您只需关注三个配置点
- 设置模型自动加载目录。
- 配置您的数据库连接。
- 设置用于您环境的数据库连接。
示例
ActiveRecord\Config::initialize(function($cfg) { $cfg->set_model_directories(array( '/path/to/your/model_directory', '/some/other/path/to/your/model_directory' )); $cfg->set_connections( array( 'development' => 'mysql://username:password@localhost/development_database_name', 'test' => 'mysql://username:password@localhost/test_database_name', 'production' => 'mysql://username:password@localhost/production_database_name' ) ); });
或者(没有 5.3 闭包)
$cfg = ActiveRecord\Config::instance(); $cfg->set_model_directory('/path/to/your/model_directory'); $cfg->set_connections( array( 'development' => 'mysql://username:password@localhost/development_database_name', 'test' => 'mysql://username:password@localhost/test_database_name', 'production' => 'mysql://username:password@localhost/production_database_name' ) );
PHP ActiveRecord 默认会使用您的开发数据库。对于测试或生产环境,您只需根据当前环境('test' 或 'production')设置默认连接。
ActiveRecord\Config::initialize(function($cfg) { $cfg->set_default_connection(your_environment); });
一旦您配置了这三个设置,您就完成了。ActiveRecord 会为您处理剩下的工作。它不需要您将表架构映射到 yaml/xml 文件中。它会查询数据库以获取这些信息,并将其缓存,以避免对单个架构进行多次数据库调用。
基本 CRUD
检索
这些是您从数据库中查找和检索记录的基本方法。有关更多详细信息,请参阅 查找器 部分。
$post = Post::find(1); echo $post->title; # 'My first blog post!!' echo $post->author_id; # 5 # also the same since it is the first record in the db $post = Post::first(); # finding using dynamic finders $post = Post::find_by_name('The Decider'); $post = Post::find_by_name_and_id('The Bridge Builder',100); $post = Post::find_by_name_or_id('The Bridge Builder',100); # finding using a conditions array $posts = Post::find('all',array('conditions' => array('name=? or id > ?','The Bridge Builder',100)));
创建
在这里,我们通过实例化一个新的对象并调用 save() 方法来创建一个新的帖子。
$post = new Post(); $post->title = 'My first blog post!!'; $post->author_id = 5; $post->save(); # INSERT INTO `posts` (title,author_id) VALUES('My first blog post!!', 5)
更新
要更新,您只需先找到一条记录,然后更改其属性之一。它保留一个属性数组,这些属性已被“污染”(即已修改),因此我们的 SQL 只会更新已修改的字段。
$post = Post::find(1); echo $post->title; # 'My first blog post!!' $post->title = 'Some real title'; $post->save(); # UPDATE `posts` SET title='Some real title' WHERE id=1 $post->title = 'New real title'; $post->author_id = 1; $post->save(); # UPDATE `posts` SET title='New real title', author_id=1 WHERE id=1
删除
删除记录不会 销毁 对象。这意味着它将调用 SQL 删除数据库中的记录,但如果需要,您仍然可以使用该对象。
$post = Post::find(1); $post->delete(); # DELETE FROM `posts` WHERE id=1 echo $post->title; # 'New real title'