vitodtagliente/pure-orm

dev-master 2022-01-21 20:57 UTC

This package is auto-updated.

Last update: 2024-09-22 03:22:30 UTC


README

对象关系映射(ORM)

如何连接

  1. 提供数据库设置实例化数据库连接
    $db = new Pure\ORM\Database("mysql", "hostname", "database", "user", "password", array(PDO_attributes));
    或绑定一个已准备好的PDO实例
    $db = Pure\ORM\Database::bind($pdo);
  2. 也可以在第一次调用查询时定义数据库设置并申请连接。这意味着在没有任何数据查询的页面上不会丢失数据库连接时间。
    Pure\ORM\Database::bind("mysql", "hostname", "database", "user", "password", array(PDO_attributes));
  3. 在步骤1或2之后,可以通过单例模式全局访问数据库实例
    $db = Pure\ORM\Database::main();
  4. 可以更改当前数据库实例
    $db1 = new Pure\ORM\Database(....);
    $db2 = new Pure\ORM\Database(....);
    
    $current = Pure\ORM\Database::main(); // this refers to $db2
    Pure\ORM\Database::change($db1);
    $current = Pure\ORM\Database::main(); // this refers to $db1
  5. 通过以下方式关闭连接
    $db->close();

如何执行查询

  1. 获取一行
    $data = $db->fetch("SELECT email, username FROM users WHERE username = ?", array("Mario"));
    或者
    $data = $db->select("users", array( 'email', 'username' ), "username = Mario" );
  2. 获取多行
    $data = $db->fetchAll("SELECT id, username FROM users");
    或者
    $data = $db->selectAll("users", array( 'email', 'username' ), $condition);
  3. 插入一行
    $result = $db->insert("users", array( "name" => "Mario", "email" => "mario.rossi@email.com"));
    $result将是true或false
  4. 更新现有行
    $result = $db->update("users", "id = 1", array( "name" => "Roberto" ) );
  5. 删除行
    $result = $db->delete("users", "id = 1");

为了在开发阶段调试代码,应该激活错误报告

Pure\ORM\Database::main()->error_reporting(true);

如何定义模型

模型类可以将模式和数据映射到对象。首先需要一个模型类声明。define函数允许开发者指定模型的属性。

class User extends Model
{
    public static function define($schema)
    {
        $schema->id();
        $schema->char('username')->unique();
        $schema->char('password');
        $schema->char('email');
        $schema->boolean('active')->default(true);
    }
}

定义模型后,很容易用对象映射数据和查询。

  1. 实例化模型

    $model = new User;
    $model->username = 'mariorossi98';
    $model->password = 'mypassword';
    $model->email = 'mario.rossi@mai.it';
    
    $model->save();

    可以使用save方法插入或更新sql数据。

    框架将自动执行此选择。

  2. 查找模型

    $model = User::find('id = 1');
  3. 删除数据

    $model = User::find('id = 1');
    // ....
    $model->erase();
  4. 检索多个模型

    $models = User::all($condition = null);
  5. 获取表名

    $table_name = User::table();
  6. 使用'data'和'json'方法将模型编码为简单的表示形式,这些表示形式应该容易共享。

    var_dump($model->data());
    /*
    [
      'id' => 1,
      'username' => 'mariorossi98',
      'password' => 'mypassword',
      'email' => 'mario.rossi@mai.it'
      'active' => 1
    ]
    */
    
    var_dump($model->json());
    /*
    {
      "id":1,
      "username":"mariorossi98",
      "mypassword":"root",
      "email":"mario.rossi@mai.it",
      "active":1
    }
    */

如何指定模型的表名

如果没有指定,表名将是模型类名+'s'。

例如,User -> 'Users'。否则,也可以指定表名

class User extends Model
{
    public static function table()
    {
        return 'my_custom_table_name';
    }
    
    public static function define($schema)
    {
        $schema->id();
        $schema->char('username')->unique();
        $schema->char('password');
        $schema->char('email');
        $schema->boolean('active')->default(true);
    }
}

如何定义模型的属性

- $schema->id($name = 'id') // adds an id property (integer, primary, increments)
- $schema->boolean($name)
- $schema->integer($name)
- $schema->float($name)
- $schema->char($name, $size = 30)
- $schema->text($name)
- $schema->date($name)
- $schema->time($name)
- $schema->datetime($name)
- $schema->timestamps()     // adds two datetime properties: 'created_at', 'updated_at'

可以通过描述符指定属性

- default($value)   // specifies the property's default value
- increments()      // 'auto_increment'
- nullable()        // by default, all properties are not nullable
- primary()         // primary key
- unique()          // unique value
- unsigned()        // valid for numbers
- link(OtherModelClass, OtherModelProperty) // foreign key

属性的描述符可以像以下示例中那样连接

$schema->integer('id')->increments()->primary();
$schema->text('notes')->nullable();
$schema->char('username', 50)->unique();
$schema->boolean('active')->default(true);

根据定义的外键,使用'link'描述符,在这个例子中是'link'

class Book extends Model
{    
    public static function define($schema)
    {
        $schema->id();
        $schema->char('name')->unique();
        $schema->integer('bought_by')->link(User::class, 'id');
    }
}

模式管理

可以使用Schema实用工具在数据库中创建、删除和检查命名表的的存在。

  1. 检查表是否存在

    $result = Pure\ORM\Schema::exists(User::class);
  2. 删除表

    $result = Pure\ORM\Schema::drop(User::class);
  3. 创建表

    $result = Pure\ORM\Schema::create(User::class);
  4. 也可以删除所有表条目

    $result = Pure\ORM\Schema::clear(User::class);

在模式创建时填充测试数据也是可能的。为此,应在Model中重写seed函数。

class User extends Model
{
    public static function define($schema)
    {
        $schema->id();
        $schema->char('username')->unique();
        $schema->char('password');
        $schema->char('email');
        $schema->boolean('active')->default(true);
    }
    
    // executed only at the schema creation
    public static function seed()
    {
        $model = new User;
        $model->username = 'test';
        $model->password = 'test';
        $model->email = 'test@mail.com';
        $model->save();
        
        // ... other models
    }
}