Skip to content

Commit

Permalink
add \Blast\Orm\Gateway as accessor of a single database table or view
Browse files Browse the repository at this point in the history
  • Loading branch information
mbunge committed Apr 13, 2016
1 parent ab00c8b commit 92e4efd
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 90 deletions.
6 changes: 6 additions & 0 deletions ChangeLog-1.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
36 changes: 29 additions & 7 deletions src/Gateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [])
Expand All @@ -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) ?
Expand All @@ -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;

}
}
17 changes: 10 additions & 7 deletions src/GatewayInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}
134 changes: 59 additions & 75 deletions src/Mapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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 {
Expand All @@ -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;
}
Expand All @@ -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());
}

Expand All @@ -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;
}

Expand All @@ -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());
}

/**
Expand All @@ -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()
);
}

/**
Expand All @@ -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);
}

/**
Expand Down Expand Up @@ -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
Expand All @@ -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());
}

Expand All @@ -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;
}
}
2 changes: 1 addition & 1 deletion tests/MapperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 92e4efd

Please sign in to comment.