surt / granada
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2020-09-06 13:57:15 UTC
README
[已弃用] 此软件包已被弃用,推荐使用 https://github.com/GranadaORM/Granada https://packagist.org.cn/packages/granadaorm/granada
描述
Granada 是一个易于使用的 Active Record 实现,基于 Idiorm/Paris,具有预加载、懒加载、查询过滤器、转换器等功能。
快速预览
use Granada\Model; class User extends Model { public function posts() { return $this->has_many('Post'); } } class Post extends Model {} // select $user = User::where('name', 'John')->find_one(); // modify $user->first_name = 'Doe'; $user->save(); // select relationship $posts = $user->posts()->find_many(); foreach ($posts as $post) { echo $post->content; }
您可以在 paris.readthedocs.org 上阅读 Paris 文档,但请确保阅读以下附加信息。
安装
使用 composer
"require": {
"surt/granada": "dev-master"
}
配置它
require 'vendor/autoload.php'; use Granada\ORM; ORM::configure('mysql:host=localhost;dbname=my_database'); ORM::configure('username', 'database_user'); ORM::configure('password', 'top_secret');
如常,您可以在 Paris 文档 中详细查看。
附加功能
预加载
您可以使用 "with" 方法向查询添加预加载关系。
$results = User::with('avatar', 'posts')->find_many();
将使用 3 个查询来获取用户及其关系
SELECT * FROM user SELECT * FROM avatar WHERE user_id IN (....) SELECT * FROM posts WHERE user_id IN (....)
您可以为每个结果获取关系结果,方法如下
foreach($results as $result){ echo $result->avatar->img; foreach($result->posts as $post){ echo $post->title; } }
懒加载
尝试访问尚未获取的关系将调用并返回它
$results = User::find_many(); foreach($results as $result){ echo $result->avatar->img; }
请注意,如果上述示例中没有 "avatar" 的结果,它将抛出 "Notice: Trying to get property of non-object...
"。注意:可能值得为这种情况和其他情况创建一个 NULL 对象。
带有预加载参数的链式关系!
您可以将关系链式连接并添加参数到关系调用中
// chained relationships with dot notation $results = User::with('posts.comments')->find_many(); // OR // chained relationships use the "with" reserved word. (usefull if you want to pass arguments to the relationships) $results = User::with(array('posts'=>array('with'=>array('comments'))))->find_many(); // SELECT * FROM user // SELECT * FROM post WHERE user_id IN (....) // SELECT * FROM comments WHERE post_id IN (....) foreach($results as $result){ foreach($posts as $post){ echo $post->title; foreach($post->comments as $comment){ echo $comment->subject; } } } // you can use arguments (one or more) to call the models relationships $results = User::with(array('posts'=>array('arg1')))->find_many(); // will call the relationship defined in the user model with the argument "arg1"
自定义查询过滤器
您可以在模型上创建静态函数,作为查询中的过滤器使用。在前面添加 "filter_"
use Granada\Model; class ModelName extends Model { .... public static function filter_aname($query, $argument1, $argument2...){ return $query->where('property', 'value')->limit('X')......; } .... }
并在静态调用中调用它
ModelName::aname($argument1, $argument2)->....
Granada 的多个附加名称
- select_raw
- group_by_raw
- order_by_raw
- raw_join
- insert : 从数组创建和保存多个元素
- pluck : 从结果返回单个列。
- find_pairs : 返回键=》值的数组作为结果
- save : 接受一个布尔值来使用 "ON DUPLICATE KEY UPDATE"(仅适用于 Mysql)
- delete_many (接受连接子句)
重载 SET
// In the Model protected function set_title($value) { $this->alias = Str::slug($value); return $value; }
// outside of the model $content_instance->set('title', 'A title'); // works with multiple set too $properties = array( 'title' => 'A title', 'content' => 'Some content' ); $content_instance->set($properties); // try it with a direct assignement $content_instance->title = 'A title';
重载 GET 和缺失属性
// In the Model // Work on defined protected function get_path($value) { return strtolower($value); } // and non-defined attributes. protected function mising_testing() { return 'whatever'; } ... // outside of the model echo $content_instance->path; // returns the lowercase path value of $content_instance echo $content_instance->testing; // returns 'whatever' since we defined a missing_{attribute_name}
当然,如果您想完全重载属性,仍然可以定义具有属性名称的函数。
在模型上定义 resultSet(集合类型)类
现在可以定义模型实例结果返回的 resultSet 类。 (如果 return_result_sets
配置变量设置为 true)请注意,定义的 resultSet 类必须 extends Granada\ResultSet
并且必须加载
// In the Model public static $resultSetClass = 'TreeResultSet';
// outside of the model var_dump(Content::find_many()); // echoes object(TreeResultSet)[10] protected '_results' => array(...) ....
ResultSet 由模型在结果中定义,正如您在上面所见。在懒加载时,结果是一致的。例如,如果我们有一个 Content
模型,具有 $resultSetClass = 'TreeResultSet'
和一个定义为 media
的 has_many
关系
Content::with('media')->find_many();
将返回一个包含 Content
实例的 TreeResultSet
,每个实例都有一个包含 Granada\ResultSet
(如果在模型上未定义,则为默认 resultSet)的 property $media
基本文档来自巴黎
巴黎
功能完成
截至版本 1.4.0,巴黎现在被认为功能完善。虽然它将继续通过错误修复进行维护,但不会添加更多新功能。
PHP5 的轻量级 Active Record 实现。
基于 Idiorm 构建。
在 PHP 5.2.0+ 上进行了测试 - 可能适用于更早的版本,只要使用 PDO 和正确的数据库驱动程序。
在 BSD 许可证 下发布。
功能
- 极其简单的配置。
- 公开了 Idiorm 的流畅查询 API 的全部功能。
- 支持关联。
- 简单的机制来封装常见的查询在过滤器方法中。
- 基于 PDO 构建。
- 在整个过程中使用 prepared statements 以保护免受 SQL 注入 攻击。
- 数据库无关。目前支持 SQLite、MySQL、Firebird 和 PostgreSQL。可能支持其他数据库,请尝试一下!
- 支持使用方法链对模型集合进行过滤或一次性对多个结果应用操作。
- 支持多个连接