vitodtagliente / pure-orm
纯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)
如何连接
- 提供数据库设置实例化数据库连接
$db = new Pure\ORM\Database("mysql", "hostname", "database", "user", "password", array(PDO_attributes));
或绑定一个已准备好的PDO实例$db = Pure\ORM\Database::bind($pdo);
- 也可以在第一次调用查询时定义数据库设置并申请连接。这意味着在没有任何数据查询的页面上不会丢失数据库连接时间。
Pure\ORM\Database::bind("mysql", "hostname", "database", "user", "password", array(PDO_attributes));
- 在步骤1或2之后,可以通过单例模式全局访问数据库实例
$db = Pure\ORM\Database::main();
- 可以更改当前数据库实例
$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
- 通过以下方式关闭连接
$db->close();
如何执行查询
- 获取一行
$data = $db->fetch("SELECT email, username FROM users WHERE username = ?", array("Mario"));
或者$data = $db->select("users", array( 'email', 'username' ), "username = Mario" );
- 获取多行
$data = $db->fetchAll("SELECT id, username FROM users");
或者$data = $db->selectAll("users", array( 'email', 'username' ), $condition);
- 插入一行
$result = $db->insert("users", array( "name" => "Mario", "email" => "mario.rossi@email.com"));
$result将是true或false - 更新现有行
$result = $db->update("users", "id = 1", array( "name" => "Roberto" ) );
- 删除行
$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); } }
定义模型后,很容易用对象映射数据和查询。
-
实例化模型
$model = new User; $model->username = 'mariorossi98'; $model->password = 'mypassword'; $model->email = 'mario.rossi@mai.it'; $model->save();
可以使用save方法插入或更新sql数据。
框架将自动执行此选择。
-
查找模型
$model = User::find('id = 1');
-
删除数据
$model = User::find('id = 1'); // .... $model->erase();
-
检索多个模型
$models = User::all($condition = null);
-
获取表名
$table_name = User::table();
-
使用'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实用工具在数据库中创建、删除和检查命名表的的存在。
-
检查表是否存在
$result = Pure\ORM\Schema::exists(User::class);
-
删除表
$result = Pure\ORM\Schema::drop(User::class);
-
创建表
$result = Pure\ORM\Schema::create(User::class);
-
也可以删除所有表条目
$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 } }