aura / sqlmapper-bundle
A SQL DataMapper implementation.
Installs: 5 011
Dependents: 0
Suggesters: 0
Security: 0
Stars: 15
Watchers: 10
Forks: 5
Open Issues: 3
pkg:composer/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
DEPRECATED
This package is DEPRECATED and will not be released in a stable version. Please consider using Atlas instead.
Foreword
Installation
This bundle is installable and autoloadable via Composer as aura/sqlmapper-bundle.
Quality
To run the unit tests at the command line, issue composer install and then phpunit at the package root. This requires Composer to be available as composer, and PHPUnit to be available as phpunit.
This library attempts to comply with PSR-1, PSR-2, and PSR-4. If you notice compliance oversights, please send a patch via pull request.
Community
To ask questions, provide feedback, or otherwise communicate with the Aura community, please join our Google Group, follow @auraphp on Twitter, or chat with us on #auraphp on Freenode.
Getting Started
Entity and Factory
<?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); } } ?>
Gateway
<?php use Aura\SqlMapper_Bundle\AbstractGateway; class PostGateway extends AbstractGateway { public function getTable() { return 'posts'; } public function getPrimaryCol() { return 'id'; } } ?>
Mapper
<?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', ]; } } ?>
Usage
<?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); ?>
Insert
<?php $object = new Post(array( 'id' => null, 'title' => 'Hello aura', 'body' => 'Some awesome content', )); $mapper->insert($object); ?>
Note: the Mapper
insertmethod assumes the primay column returned bygetPrimaryColis autogenerated by the database unless your concrete implementation of AbstractMapper overrides theisAutoPrimarymethod and returns a boolean false method. You will need to create to implementisAutoPrimaryif you want to insert rows which contain values for the primary column.
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]); ?>
Update
<?php $post = $mapper->fetchObjectBy('id', 1) $post->title = 'Changed the title'; $mapper->update($post); ?>
Update only changes
<?php $initial = $mapper->fetchObjectBy('id', 1) $post = clone $initial; $post->body = 'Changed the body'; $mapper->update($post, $initial); ?>
Delete
<?php $post = $mapper->fetchObjectBy('id', 1); $mapper->delete($post); ?>
Object and Collection Factory
By default the mapper returns standard class objects. You can change this behaviour when creating the mapper, by extending ObjectFactory or by implmenting 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); ?>
Override identity field
By default, mapper assumes a public property as the identity field (or one that appears public via the magic __set() method). If the individual object uses a different property name, or uses a method instead, override setIdentityValue method to provide setter functionality.
Example :
<?php namespace Vendor\Package; use Aura\SqlMapper_Bundle\AbstractMapper; class PostMapper extends AbstractMapper { public function setIdentityValue($object, $value) { $object->setId($value); } // more code } ?>
Filters
Filters can be used to alter the values during insert and update operations. Filter provides two methods which can be overridden, forInsert($subject) and forUpdate($subject). $subject may be passed as either an object or an array, so your code should be prepared to handle both.