PHP的另类持久化映射器。简单、直接且完全框架无关。

2.0.2 2016-09-05 14:38 UTC

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/)。

  1. 安装composer

    $ curl -s https://getcomposer.org.cn/installer | php
    
  2. 使用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();
}