aura/sqlmapper-bundle

此包已废弃,不再维护。作者建议使用atlas/orm包。

SQL数据映射实现。

0.0.1 2015-04-01 14:29 UTC

This package is auto-updated.

Last update: 2022-02-01 12:43:23 UTC


README

已弃用

此包已弃用,将不会发布稳定版本。请考虑使用Atlas

前言

安装

此包可以通过Composer以aura/sqlmapper-bundle方式安装和自动加载。

质量

Scrutinizer Code Quality Code Coverage Build Status

要在命令行运行单元测试,请执行composer install,然后在包根目录下执行phpunit。这需要composer作为Composer可用,以及phpunit作为PHPUnit可用。

此库试图遵守PSR-1PSR-2PSR-4。如果您注意到遵守上的疏忽,请通过pull request发送补丁。

社区

要提问、提供反馈或与Aura社区进行其他交流,请加入我们的Google Group,关注@auraphp on Twitter,或在Freenode的#auraphp上与我们聊天。

入门

实体和工厂

<?php
use Aura\SqlMapper_Bundle\ObjectFactory;

class Post
{
    public $id;
    public $title;
    public $body;

    public function __construct(array $data = array())
    {
        foreach ($data as $field => $value) {
            $this->$field = $value;
        }
    }
}

class PostFactory extends ObjectFactory
{
    public function newObject(array $row = array())
    {
        return new Post($row);
    }
}
?>

网关

<?php
use Aura\SqlMapper_Bundle\AbstractGateway;

class PostGateway extends AbstractGateway
{
    public function getTable()
    {
        return 'posts';
    }

    public function getPrimaryCol()
    {
        return 'id';
    }
}
?>

映射器

<?php
use Aura\SqlMapper_Bundle\AbstractMapper;

class PostMapper extends AbstractMapper
{
    public function getIdentityField()
    {
        return 'id';
    }

    public function getColsFields()
    {
        return [
            'id'    => 'id',
            'title' => 'title',
            'body'  => 'body',
        ];
    }
}
?>

用法

<?php
use Aura\Sql\ConnectionLocator;
use Aura\Sql\ExtendedPdo;
use Aura\SqlMapper_Bundle\Query\ConnectedQueryFactory;
use Aura\SqlMapper_Bundle\Filter;
use Aura\SqlQuery\QueryFactory;
use Aura\Sql\Profiler;

$profiler = new Profiler();
$connection_locator = new ConnectionLocator(function () use ($profiler) {
    $pdo = new ExtendedPdo('sqlite::memory:');
    $pdo->setProfiler($profiler);
    return $pdo;
});

$query = new ConnectedQueryFactory(new QueryFactory('sqlite'));

$gateway_filter = new Filter();
$gateway = new PostGateway($connection_locator, $query, $gateway_filter);

$object_factory = new PostFactory();
$mapper_filter = new Filter();
$mapper = new PostMapper($gateway, $object_factory, $mapper_filter);
?>

插入

<?php
$object = new Post(array(
    'id' => null,
    'title' => 'Hello aura',
    'body' => 'Some awesome content',
));

$mapper->insert($object);
?>

注意:映射器的insert方法假定由getPrimaryCol返回的主列是由数据库自动生成的,除非您的具体AbstractMapper实现覆盖了isAutoPrimary方法并返回布尔值false。如果您想插入包含主列值的行,则需要创建并实现isAutoPrimary

fetchObject

<?php
$post = $mapper->fetchObject(
    $mapper->select()->where('id = ?', 1)
);
?>

fetchObjectBy

<?php
$post = $mapper->fetchObjectBy('id', 1);
?>

fetchCollection

<?php
$posts = $mapper->fetchCollection(
    $mapper->select()->where('id < ?', 11)
);
?>

fetchCollectionBy

<?php
$posts = $mapper->fetchCollectionBy('id', [1, 2, 3]);
?>

更新

<?php
$post = $mapper->fetchObjectBy('id', 1)
$post->title = 'Changed the title';
$mapper->update($post);
?>

仅更新更改

<?php
$initial = $mapper->fetchObjectBy('id', 1)

$post = clone $initial;
$post->body = 'Changed the body';

$mapper->update($post, $initial);
?>

删除

<?php
$post = $mapper->fetchObjectBy('id', 1);
$mapper->delete($post);
?>

对象和集合工厂

默认情况下,映射器返回标准类对象。在创建映射器时,可以通过扩展 ObjectFactory 或实现 ObjectFactoryInterface 来更改此行为。

<?php
use Aura\SqlMapper_Bundle\ObjectFactoryInterface;
use Aura\SqlMapper_Bundle\Filter;

class PostFactory implements ObjectFactoryInterface
{
    public function newObject(array $row = array())
    {
        return new Post($row);
    }

    public function newCollection(array $rows = array())
    {
        $coll = array();
        foreach ($rows as $row) {
            $coll[] = $this->newObject($row);
        }
        return $coll;
    }
}

$object_factory new PostFactory();
$mapper_filter = new Filter();
$mapper = new PostMapper($gateway, $object_factory, $mapper_filter);
?>

覆盖标识字段

默认情况下,映射器假定公开的属性为标识字段(或通过魔法 __set() 方法显示为公开的属性)。如果单个对象使用不同的属性名,或使用方法代替,请覆盖 setIdentityValue 方法以提供设置功能。

示例

<?php
namespace Vendor\Package;

use Aura\SqlMapper_Bundle\AbstractMapper;

class PostMapper extends AbstractMapper
{
    public function setIdentityValue($object, $value)
    {
        $object->setId($value);
    }
    // more code
}
?>

过滤器

可以使用过滤器在插入和更新操作期间更改值。 Filter 提供了两个可以覆盖的方法,即 forInsert($subject)forUpdate($subject)$subject 可以作为对象或数组传递,因此您的代码应该准备好处理两者。