aura / sqlmapper-bundle
Requires
- php: >=5.4.0
- aura/sql: ~2.0
- aura/sqlquery: ~2.0
This package is auto-updated.
Last update: 2022-02-01 12:43:23 UTC
README
已弃用
此包已弃用,将不会发布稳定版本。请考虑使用Atlas。
前言
安装
此包可以通过Composer以aura/sqlmapper-bundle方式安装和自动加载。
质量
要在命令行运行单元测试,请执行composer install
,然后在包根目录下执行phpunit
。这需要composer
作为Composer可用,以及phpunit
作为PHPUnit可用。
此库试图遵守PSR-1、PSR-2和PSR-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
可以作为对象或数组传递,因此您的代码应该准备好处理两者。