mirror of
https://github.com/torrentpier/torrentpier
synced 2025-08-22 22:33:55 -07:00
Added methods to simplify the work with the database
This commit is contained in:
parent
93a2b72196
commit
e3303169ea
6 changed files with 341 additions and 14 deletions
197
src/Db/Adapter.php
Normal file
197
src/Db/Adapter.php
Normal 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
18
src/Db/Entity.php
Normal 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;
|
||||
}
|
||||
}
|
78
src/Db/PrepareStatement.php
Normal file
78
src/Db/PrepareStatement.php
Normal 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();
|
||||
}
|
||||
}
|
|
@ -4,8 +4,8 @@ namespace TorrentPier\ServiceProviders;
|
|||
|
||||
use Pimple\Container;
|
||||
use Pimple\ServiceProviderInterface;
|
||||
use TorrentPier\Config;
|
||||
use Zend\Db\Adapter\Adapter;
|
||||
use TorrentPier\Db\Adapter;
|
||||
use TorrentPier\Db\Connection;
|
||||
|
||||
class DbServiceProvider implements ServiceProviderInterface
|
||||
{
|
||||
|
@ -15,15 +15,8 @@ class DbServiceProvider implements ServiceProviderInterface
|
|||
public function register(Container $container)
|
||||
{
|
||||
$container['db'] = function ($container) {
|
||||
$config = $container['config.db'];
|
||||
|
||||
if ($config instanceof Config) {
|
||||
$config = $config->toArray();
|
||||
}
|
||||
|
||||
$adapter = new Adapter($config);
|
||||
$adapter = new Adapter($container['config.db']);
|
||||
unset($container['config.db']);
|
||||
|
||||
return $adapter;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -4,12 +4,45 @@ define('BB_SCRIPT', 'styleguide');
|
|||
define('BB_ROOT', './');
|
||||
require_once __DIR__ . '/common.php';
|
||||
|
||||
$user->session_start();
|
||||
|
||||
$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', [
|
||||
'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();
|
||||
|
|
|
@ -7,4 +7,12 @@
|
|||
<button type="submit">{% trans %}Send{% endtrans %}</button>
|
||||
</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>
|
Loading…
Add table
Add a link
Reference in a new issue