surt / granada

此软件包已被弃用且不再维护。作者建议使用 granadaorm/granada 软件包。

具有预加载、懒加载和更多功能的 Active Record / ORM

1.5.2 2013-11-10 12:46 UTC

This package is auto-updated.

Last update: 2020-09-06 13:57:15 UTC


README

Latest Stable Version Build Status deprecated

[已弃用] 此软件包已被弃用,推荐使用 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' 和一个定义为 mediahas_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。可能支持其他数据库,请尝试一下!
  • 支持使用方法链对模型集合进行过滤或一次性对多个结果应用操作。
  • 支持多个连接