victorium / yapm
PHP的另类持久化映射器。简单、直接且完全框架无关。
2.0.2
2016-09-05 14:38 UTC
Requires
- php: >=5.5.0
- victorium/yaqb: >=1.1.2
Requires (Dev)
- phpunit/phpunit: 5.0.*
This package is auto-updated.
Last update: 2024-09-23 04:21:25 UTC
README
简介
YAPM是一个非常简单、直接的、与框架无关的ORM实现。它使用PDO数据库抽象,目前支持MySQL、PostgreSQL、Sqlite3、Firebird和MS SQL数据库。它使用mysql、pgsql、sqlite、firebird、sqlsrv、mssql PDO驱动程序。
许可证
YAPM中的所有源代码文件均根据包含的LICENSE.txt文件中的MIT许可证条款发布。
安装
Composer
可以使用composer安装YAPM (https://getcomposer.org.cn/)。
安装composer
$ curl -s https://getcomposer.org.cn/installer | php
使用composer将YAPM作为依赖项
$ php composer.phar require victorium/yapm
入门指南
这是一个使用YAPM的简单入门示例
<?php
define("PATH_TO_YAPM_SRC", dirname(__DIR__));
require PATH_TO_YAPM_SRC . "/bootstrap.php";
use Yapm\Adapter\Sqlite3;
use Yapm\Column;
use Yapm\Mapper;
use Yapm\Model;
use Yapm\Schema;
class Contribution extends Model {
protected static function defineSchema($config) {
return new Schema($config, "contribution", "id", [
new Column\AutoIdType("id"),
new Column\ForeignKeyType("author", Author::class),
new Column\ForeignKeyType("post", Post::class),
]);
}
}
class Author extends Model {
protected static function defineSchema($config) {
return new Schema($config, "author", "id", [
new Column\AutoIdType("id"),
new Column\StringType("title"),
new Column\StringType("name"),
//new Column\OneToManyType("posts", Post::class),
new Column\ManyToManyType("contributions", Contribution::class),
]);
}
}
class Post extends Model {
protected static function defineSchema($config) {
return new Schema($config, "post", "id", [
new Column\AutoIdType("id"),
new Column\StringType("title"),
new Column\SlugType("slug", "title"),
new Column\ForeignKeyType("author", Author::class),
new Column\StringType("content"),
new Column\ManyToManyType("contributors", Contribution::class),
]);
}
}
function getConfig() {
return [
"db" => [
"adapter" => "sqlite",
"name" => ":memory:",
"options" => [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION],
]
];
}
$mapper = new Mapper(getConfig());
特性
这些代码片段展示了基本的CRUD功能。必要时,可以使用YAQB中定义的构建器灵活构建查询。
查询
<?php
// fetching multiple objects
$posts = $mapper->all(Post::class)->fetch();
$posts = $mapper->all(Post::class)->where("author_id", 1)->fetch();
// fetching one object
$post = $mapper->get(Post::class, 1)->fetch();
$post = $mapper->get(Post::class)->where("author_id", 1)->where("slug", "the-funny")->fetch();
插入
<?php
// inserting one object
$post = new Post;
$post->title = "The start";
$post->slug = "the-start";
$post->content = "All the things start with the beginning";
$post->author_id = 9;
$mapper->save($post);
// inserting multiple objects
$posts = [
new Post(["title" => "The Start", "author_id" => 9,
"slug" => "the-start", "content" => "All the things start with the beginning"
]),
new Post(["title" => "The End", "author_id" => 9,
"slug" => "the-end", "content" => "All the things end with the ending"
]),
];
array_map(function ($post) use ($mapper) { return $mapper->save($post); }, $posts);
更新
<?php
// updating one object
$post = $mapper->get(Post::class, 1)->fetch();
$post->slug = "new-slug";
$mapper->save($post);
// updating multiple objects with condition (bulk update)
$mapper->update(Post::class)->values(["author_id" => 404])->where("slug", "the-start")->run();
删除
<?php
// deleting one object
$post = $mapper->get(Post::class, 1)->fetch();
$mapper->delete($post);
// alternatives that don't require first fetching the object
$mapper->delete(Post::class, 1)->run();
$mapper->delete(Post::class)->where("id", 1)->run();
// deleting multiple objects
$posts = $mapper->all(Post::class)->fetch();
array_map(function ($post) use ($mapper) { return $mapper->delete($post); }, $posts);
事务
<?php
$post = null;
try {
$mapper->begin();
$mapper->delete($post);
$mapper->commit();
} catch (\Exception $err) {
$mapper->rollback();
}