Added methods to simplify the work with the database

This commit is contained in:
Vasily Komrakov 2016-02-14 03:37:25 +03:00
commit e3303169ea
6 changed files with 341 additions and 14 deletions

197
src/Db/Adapter.php Normal file
View file

@ -0,0 +1,197 @@
<?php
namespace TorrentPier\Db;
use TorrentPier\Config;
use Zend\Db\Adapter\Driver\ResultInterface;
use Zend\Db\Adapter\Platform\PlatformInterface;
use Zend\Db\Adapter\Profiler\ProfilerInterface;
use Zend\Db\Exception\InvalidArgumentException;
use Zend\Db\ResultSet\ResultSetInterface;
use Zend\Db\Sql\Delete;
use Zend\Db\Sql\Expression;
use Zend\Db\Sql\Insert;
use Zend\Db\Sql\Select;
use Zend\Db\Sql\Sql;
use Zend\Db\Sql\Update;
use Zend\Db\Sql\Where;
/**
* Class Adapter
* @package TorrentPier\Db
*/
class Adapter extends \Zend\Db\Adapter\Adapter
{
/**
* @var Entity|null
*/
protected $resultWrapper;
/**
* {@inheritdoc}
*/
public function __construct($driver, PlatformInterface $platform = null, ResultSetInterface $queryResultPrototype = null, ProfilerInterface $profiler = null)
{
if ($driver instanceof Config) {
$driver = $driver->toArray();
}
parent::__construct($driver, $platform, $queryResultPrototype, $profiler);
}
/**
* Get sql object.
*
* @return Sql
*/
protected function getSql()
{
return new Sql($this);
}
/**
* Prepare table name.
*
* @param $table
* @return mixed
*/
protected function prepareTable($table)
{
$this->resultWrapper = null;
if (is_string($table) && class_exists($table)) {
$this->resultWrapper = new $table;
$table = $this->resultWrapper->table();
}
return $table;
}
/**
* Insert row to database.
*
* @param $table
* @param array $values
* @return mixed|null
*
* @throws InvalidArgumentException
*/
public function insert($table, array $values)
{
$table = $this->prepareTable($table);
$sql = $this->getSql();
/** @var Insert $sqlInsert */
$sqlInsert = $sql->insert($table);
$sqlInsert->values($values);
$statementContainer = $sql->prepareStatementForSqlObject($sqlInsert);
/** @var ResultInterface $result */
$result = $statementContainer->execute();
return $result->getGeneratedValue();
}
/**
* Update rows in database.
*
* @param $table
* @param array $values
* @param Where|\Closure|string|array $where
* @return int
*
* @throws InvalidArgumentException
*/
public function update($table, array $values, $where)
{
$table = $this->prepareTable($table);
$sql = $this->getSql();
/** @var Update $sqlUpdate */
$sqlUpdate = $sql->update($table);
$sqlUpdate->set($values);
$sqlUpdate->where($where);
$statementContainer = $sql->prepareStatementForSqlObject($sqlUpdate);
/** @var ResultInterface $result */
$result = $statementContainer->execute();
return $result->getAffectedRows();
}
/**
* Delete rows from database.
*
* @param string $table
* @param array $where
* @return int
*/
public function delete($table, array $where)
{
$table = $this->prepareTable($table);
$sql = $this->getSql();
/** @var Delete $sqlDelete */
$sqlDelete = $sql->delete($table);
$sqlDelete->where($where);
$statementContainer = $sql->prepareStatementForSqlObject($sqlDelete);
/** @var ResultInterface $result */
$result = $statementContainer->execute();
return $result->getAffectedRows();
}
/**
* Select rows from database.
*
* @param $table
* @param null|\Closure|array $queryCallback
* @return PrepareStatement
* @throws InvalidArgumentException
*/
public function select($table, $queryCallback = null)
{
$table = $this->prepareTable($table);
$sql = $this->getSql();
/** @var Select $sqlDelete */
$sqlSelect = $sql->select($table);
if ($queryCallback instanceof \Closure) {
call_user_func($queryCallback, $sqlSelect);
} elseif (is_array($queryCallback)) {
$sqlSelect->where($queryCallback);
}
$statementContainer = $sql->prepareStatementForSqlObject($sqlSelect);
return new PrepareStatement($statementContainer, $this->resultWrapper);
}
/**
* Count rows in database.
*
* @param $table
* @param null|\Closure|array $queryCallback
* @return int
* @throws InvalidArgumentException
*/
public function count($table, $queryCallback = null)
{
$table = $this->prepareTable($table);
$sql = $this->getSql();
/** @var Select $sqlDelete */
$sqlSelect = $sql->select($table);
if ($queryCallback instanceof \Closure) {
call_user_func($queryCallback, $sqlSelect);
} elseif (is_array($queryCallback)) {
$sqlSelect->where($queryCallback);
}
$sqlSelect->columns(['count' => new Expression('COUNT(*)')]);
$statementContainer = $sql->prepareStatementForSqlObject($sqlSelect);
/** @var ResultInterface $result */
$result = $statementContainer->execute();
return $result->current()['count'];
}
}

18
src/Db/Entity.php Normal file
View file

@ -0,0 +1,18 @@
<?php
namespace TorrentPier\Db;
abstract class Entity
{
protected $table;
public function table()
{
return $this->table;
}
public function initData($data)
{
return $this;
}
}

View file

@ -0,0 +1,78 @@
<?php
namespace TorrentPier\Db;
use Zend\Db\Adapter\Driver\StatementInterface;
use Zend\Db\Exception\InvalidArgumentException;
use Zend\Db\ResultSet\HydratingResultSet;
use Zend\Db\ResultSet\ResultSet;
use Zend\Hydrator\Reflection;
class PrepareStatement
{
/**
* @var StatementInterface
*/
protected $statementContainer;
/**
* @var Entity
*/
protected $resultWrapper;
/**
* PrepareStatement constructor.
*
* @param StatementInterface $statementContainer
* @param Entity|null $resultWrapper
*/
public function __construct(StatementInterface $statementContainer, Entity $resultWrapper = null)
{
$this->statementContainer = $statementContainer;
$this->resultWrapper = $resultWrapper;
}
/**
* Executing a query and wrapping a result.
*
* @return HydratingResultSet|ResultSet
* @throws InvalidArgumentException
*/
protected function execute()
{
$result = $this->statementContainer->execute();
if ($this->resultWrapper) {
$entityClass = $this->resultWrapper;
$resultSet = new HydratingResultSet(new Reflection(), new $entityClass);
$resultSet->initialize($result);
} else {
$resultSet = new ResultSet();
$resultSet->initialize($result);
}
return $resultSet;
}
/**
* Current result.
*
* @return array|null
* @throws InvalidArgumentException
*/
public function one()
{
return $this->execute()->current() ?: null;
}
/**
* All results.
*
* @return HydratingResultSet|ResultSet
* @throws InvalidArgumentException
*/
public function all()
{
return $this->execute();
}
}

View file

@ -4,8 +4,8 @@ namespace TorrentPier\ServiceProviders;
use Pimple\Container; use Pimple\Container;
use Pimple\ServiceProviderInterface; use Pimple\ServiceProviderInterface;
use TorrentPier\Config; use TorrentPier\Db\Adapter;
use Zend\Db\Adapter\Adapter; use TorrentPier\Db\Connection;
class DbServiceProvider implements ServiceProviderInterface class DbServiceProvider implements ServiceProviderInterface
{ {
@ -15,15 +15,8 @@ class DbServiceProvider implements ServiceProviderInterface
public function register(Container $container) public function register(Container $container)
{ {
$container['db'] = function ($container) { $container['db'] = function ($container) {
$config = $container['config.db']; $adapter = new Adapter($container['config.db']);
if ($config instanceof Config) {
$config = $config->toArray();
}
$adapter = new Adapter($config);
unset($container['config.db']); unset($container['config.db']);
return $adapter; return $adapter;
}; };
} }

View file

@ -4,12 +4,45 @@ define('BB_SCRIPT', 'styleguide');
define('BB_ROOT', './'); define('BB_ROOT', './');
require_once __DIR__ . '/common.php'; require_once __DIR__ . '/common.php';
$user->session_start();
$di = \TorrentPier\Di::getInstance(); $di = \TorrentPier\Di::getInstance();
/** @var \TorrentPier\Db\Adapter $db */
$db = $di->db;
//$id = $db->insert(BB_USERS, [
// 'username' => 'user_' . rand(1, 50)
//]);
//
//$result = $db->update(BB_USERS, ['user_email' => 'user_' . rand(1, 50) . '@test.com'], ['user_id' => $id]);
//
//var_dump($result);
//
//$result = $db->delete(BB_USERS, ['user_id' => $id]);
//
//var_dump($result);
///** @var \TorrentPier\Db\Result $users */
//$users = $db->select(BB_USERS, function(\Zend\Db\Sql\Select $select) {
// $select->columns(['id' => 'user_id', 'name' => 'username']);
// $select->join(['t' => BB_TOPICS], 't.topic_poster = u.user_id', ['title' => 'topic_title']);
// $select->where(function(\Zend\Db\Sql\Where $where) {
// $where->greaterThanOrEqualTo('user_id', 3);
//// $where->equalTo('user_id', 3);
// });
//});
$query = function(\Zend\Db\Sql\Select $select) {
$select->columns(['id' => 'user_id', 'name' => 'username']);
$select->join(['t' => BB_TOPICS], 't.topic_poster = u.user_id', ['title' => 'topic_title']);
// $select->where(['user_id > ?' => 0]);
};
$users = $db->select(['u' => BB_USERS], $query)->all();
$usersCount = $db->count(['u' => BB_USERS], $query);
$content = $di->view->make('styleguide', [ $content = $di->view->make('styleguide', [
'name' => $di->request->get('name', $user->data['username']) 'name' => $di->request->get('name', 'Admin'),
'users' => $users,
'users_count' => $usersCount
]); ]);
$response = \Symfony\Component\HttpFoundation\Response::create(); $response = \Symfony\Component\HttpFoundation\Response::create();

View file

@ -7,4 +7,12 @@
<button type="submit">{% trans %}Send{% endtrans %}</button> <button type="submit">{% trans %}Send{% endtrans %}</button>
</form> </form>
<pre>{% trans with { '%name%': name|e } %}Hello, %name%{% endtrans %}</pre> <pre>{% trans with { '%name%': name|e } %}Hello, %name%{% endtrans %}</pre>
<ul>
{% for user in users %}
<li>ID: {{ user.id }} => {{ user.name|e }} - {{ user.title|e }}</li>
{% endfor %}
<li>TOTAL: {{ users_count }}</li>
</ul>