diff --git a/ChangeLog-1.0.md b/ChangeLog-1.0.md index 8ea85ba..14dd6ef 100644 --- a/ChangeLog-1.0.md +++ b/ChangeLog-1.0.md @@ -2,6 +2,12 @@ All notable changes of the Blast orm 1.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## 0.6.2 + +### Added + + - add `\Blast\Orm\Gateway` as accessor of a single database table or view + ## 0.6.1 ### Added diff --git a/src/Gateway.php b/src/Gateway.php index 47a186e..a514ede 100644 --- a/src/Gateway.php +++ b/src/Gateway.php @@ -43,7 +43,7 @@ public function __construct($table) * * @param $data * - * @param Column[] $fields + * @param \Doctrine\DBAL\Schema\Column[] $fields * @return $this */ public function insert($data, $fields = []) @@ -60,7 +60,7 @@ public function insert($data, $fields = []) foreach ($data as $key => $value) { if ($value instanceof RelationInterface) { continue; - }; + } $query->setValue($key, $query->createPositionalParameter( $value, array_key_exists($key, $fields) ? @@ -74,25 +74,47 @@ public function insert($data, $fields = []) /** * Prepare update statement * - * @param $primaryKey + * @param $primaryKeyName * @param $data + * @param \Doctrine\DBAL\Schema\Column[] $fields * * @return mixed */ - public function update($primaryKey, $data) + public function update($primaryKeyName, $data, $fields = []) { - // TODO: Implement update() method. + //prepare statement + $query = $this->getConnection()->createQuery(); + $query->update($this->table); + + foreach ($data as $key => $value) { + if ($value instanceof RelationInterface) { + continue; + } + $query->set($key, $query->createPositionalParameter( + $value, array_key_exists($key, $fields) ? + $fields[$key]->getType()->getName() : + Type::STRING)); + } + + return $query->where($query->expr()->eq($primaryKeyName, $data[$primaryKeyName])); } /** * Prepare delete statement * + * @param $primaryKeyName * @param $primaryKey * * @return mixed */ - public function delete($primaryKey) + public function delete($primaryKeyName, $primaryKey) { - // TODO: Implement delete() method. + $query = $this->getConnection()->createQuery(); + $query + ->delete($this->table) + ->where($query->expr()->eq($primaryKeyName, $query->createPositionalParameter($primaryKey))); + + return $query; + } } diff --git a/src/GatewayInterface.php b/src/GatewayInterface.php index fad4275..1542134 100644 --- a/src/GatewayInterface.php +++ b/src/GatewayInterface.php @@ -30,30 +30,33 @@ public function __construct($table); /** * Prepare insert statement - * + * * @param $data + * @param \Doctrine\DBAL\Schema\Column[] $fields * * @return $this */ - public function insert($data); + public function insert($data, $fields = []); /** * Prepare update statement - * - * @param $primaryKey + * + * @param $primaryKeyName * @param $data + * @param \Doctrine\DBAL\Schema\Column[] $fields * * @return mixed */ - public function update($primaryKey, $data); + public function update($primaryKeyName, $data, $fields = []); /** * Prepare delete statement - * + * + * @param $primaryKeyName * @param $primaryKey * * @return mixed */ - public function delete($primaryKey); + public function delete($primaryKeyName, $primaryKey); } diff --git a/src/Mapper.php b/src/Mapper.php index e422f2a..84330dd 100644 --- a/src/Mapper.php +++ b/src/Mapper.php @@ -23,7 +23,6 @@ use Blast\Orm\Relations\HasOne; use Blast\Orm\Relations\ManyToMany; use Blast\Orm\Relations\RelationInterface; -use Doctrine\DBAL\Types\Type; use stdClass; /** @@ -59,10 +58,10 @@ class Mapper implements EntityAwareInterface, ConnectionAwareInterface, MapperIn public function __construct($entity, $connection = null) { $this->connection = $connection; - if ($entity instanceof DefinitionInterface) { + if ( $entity instanceof DefinitionInterface ) { $this->setEntity($entity->getEntity()); $this->definition = $entity; - }elseif ($entity instanceof ProviderInterface) { + } elseif ( $entity instanceof ProviderInterface ) { $this->setEntity($entity->getEntity()); $this->provider = $entity; } else { @@ -79,9 +78,10 @@ public function __construct($entity, $connection = null) public function find($primaryKey) { $query = $this->select(); - $definition = $this->getDefinition(); - $field = $definition->getPrimaryKeyName(); - $query->where($query->expr()->eq($field, $query->createPositionalParameter($primaryKey))); + $query->where($query->expr()->eq( + $this->getDefinition()->getPrimaryKeyName(), + $query->createPositionalParameter($primaryKey)) + ); return $query; } @@ -94,30 +94,38 @@ public function find($primaryKey) */ public function select($selects = ['*']) { - $query = $this->createQuery(); - $query->select($selects); - $definition = $this->getDefinition(); - $tableName = $definition->getTableName(); - $query->from($tableName); - - return $query; + return $this->createQuery() + ->select($selects) + ->from($this->getDefinition()->getTableName()); } /** * Create a new Query instance - * @return Query + * @return \Blast\Orm\Query */ public function createQuery() { return new Query($this->getConnection(), $this->getEntity()); } + /** + * Create a new Query instance + * @return \Blast\Orm\Gateway + */ + public function createGateway($tableName) + { + $gateway = new Gateway($tableName); + $gateway->setConnection($this->getConnection()); + + return $gateway; + } + /** * @return ProviderInterface */ public function getProvider() { - if (null === $this->provider) { + if ( null === $this->provider ) { $this->provider = $this->createProvider($this->getEntity()); } @@ -129,9 +137,10 @@ public function getProvider() */ public function getDefinition() { - if (null === $this->definition) { + if ( null === $this->definition ) { $this->definition = $this->createProvider($this->getEntity())->getDefinition(); } + return $this->definition; } @@ -145,17 +154,12 @@ public function create($entity) { //load entity provider $provider = $this->prepareProvider($entity); + $definition = $provider->getDefinition(); //disallow differing entities - $this->checkEntity($provider); - - //pass data without relations - $data = $provider->extract(); - - $fields = $provider->getDefinition()->getFields(); - $gateway = new Gateway($provider->getDefinition()->getTableName()); - - return $gateway->insert($data, $fields); + return $this->checkEntity($definition->getEntity()) + ->createGateway($definition->getTableName()) + ->insert($provider->extract(), $definition->getFields()); } /** @@ -168,34 +172,16 @@ public function update($entity) { //load entity provider $provider = $this->prepareProvider($entity); + $definition = $provider->getDefinition(); //disallow differing entities - $this->checkEntity($provider); - - $pkName = $provider->getDefinition()->getPrimaryKeyName(); - //pass data without relations - $data = $provider->extract(); - $fields = $provider->getDefinition()->getFields(); - - - //prepare statement - $query = $this->createQuery(); - $query->update($provider->getDefinition()->getTableName()); - - - foreach ($data as $key => $value) { - if ($value instanceof RelationInterface) { - continue; - } - $query->set($key, $query->createPositionalParameter( - $value, array_key_exists($key, $fields) ? - $fields[$key]->getType()->getName() : - Type::STRING)); - } - - $query->where($query->expr()->eq($pkName, $data[$pkName])); - - return $query; + return $this->checkEntity($definition->getEntity()) + ->createGateway($definition->getTableName()) + ->update( + $definition->getPrimaryKeyName(), + $provider->extract(), + $definition->getFields() + ); } /** @@ -212,31 +198,26 @@ public function save($entity) /** * Prepare delete query for attached entity by identifiers * - * @param array|int|string $identifiers + * @param int|string $identifier * @return query */ - public function delete($identifiers) + public function delete($identifier) { - $identifiers = is_array($identifiers) ? $identifiers : [$identifiers]; $definition = $this->getDefinition(); //prepare statement - $pkName = $definition->getPrimaryKeyName(); - $query = $this->createQuery(); - $query->delete($definition->getTableName()); - - //add entities by pk to delete - foreach ($identifiers as $identifier) { - if (is_object($identifier)) { - $identifierProvider = $this->createProvider($identifier); - $this->checkEntity($identifierProvider); - $data = $identifierProvider->extract(); - $identifier = $data[$pkName]; - } - $query->orWhere($query->expr()->eq($pkName, $query->createPositionalParameter($identifier))); + $primaryKeyName = $definition->getPrimaryKeyName(); + + if ( is_object($identifier) ) { + $identifierProvider = $this->createProvider($identifier); + $this->checkEntity($identifierProvider->getEntity()); + $data = $identifierProvider->extract(); + $identifier = $data[$primaryKeyName]; } - return $query; + return $this + ->createGateway($definition->getTableName()) + ->delete($primaryKeyName, $identifier); } /** @@ -327,7 +308,7 @@ public function manyToMany( */ private function prepareProvider($entity) { - if (is_array($entity)) { + if ( is_array($entity) ) { $provider = $this->createProvider($this->getEntity()); // reset entity in provider and @@ -348,7 +329,7 @@ private function prepareProvider($entity) */ private function prepareRelation(RelationInterface $relation) { - if ($relation instanceof ConnectionAwareInterface) { + if ( $relation instanceof ConnectionAwareInterface ) { $relation->setConnection($this->getConnection()); } @@ -358,15 +339,18 @@ private function prepareRelation(RelationInterface $relation) /** * Check if external entity matches mapper entity * - * @param $provider + * @param $entity + * + * @return $this * * @throws \InvalidArgumentException */ - private function checkEntity(ProviderInterface $provider) + private function checkEntity($entity) { - $class = get_class($provider->getEntity()); - if ($class !== get_class($this->getDefinition()->getEntity())) { - throw new \InvalidArgumentException('Disallowed usage of differing entity!' . $class); + if ( get_class($entity) !== get_class($this->getDefinition()->getEntity()) ) { + throw new \InvalidArgumentException('Disallowed usage of differing entity!' . get_class($entity)); } + + return $this; } } diff --git a/tests/MapperTest.php b/tests/MapperTest.php index 9417aeb..0dfeb3c 100644 --- a/tests/MapperTest.php +++ b/tests/MapperTest.php @@ -129,7 +129,7 @@ public function testSaveExisting() public function testDelete() { $mapper = new Mapper(new Post); - $post = $result = $mapper->find(2)->execute(); + $post = $mapper->find(2)->execute(); $result = $mapper->delete($post)->execute(); $this->assertEquals($result, 1);