diff --git a/src/Db/Adapter.php b/src/Db/Adapter.php new file mode 100644 index 000000000..8affe7b59 --- /dev/null +++ b/src/Db/Adapter.php @@ -0,0 +1,197 @@ +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']; + } +} diff --git a/src/Db/Entity.php b/src/Db/Entity.php new file mode 100644 index 000000000..2d7cf7596 --- /dev/null +++ b/src/Db/Entity.php @@ -0,0 +1,18 @@ +table; + } + + public function initData($data) + { + return $this; + } +} diff --git a/src/Db/PrepareStatement.php b/src/Db/PrepareStatement.php new file mode 100644 index 000000000..7aabd7188 --- /dev/null +++ b/src/Db/PrepareStatement.php @@ -0,0 +1,78 @@ +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(); + } +} diff --git a/src/ServiceProviders/DbServiceProvider.php b/src/ServiceProviders/DbServiceProvider.php index dc7c99ba9..714c7a8f7 100644 --- a/src/ServiceProviders/DbServiceProvider.php +++ b/src/ServiceProviders/DbServiceProvider.php @@ -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; }; } diff --git a/styleguide.php b/styleguide.php index 6256f11a5..58cd3e2fd 100644 --- a/styleguide.php +++ b/styleguide.php @@ -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(); diff --git a/templates/default/styleguide.twig b/templates/default/styleguide.twig index 2c3bcbcb9..390cfbc1b 100644 --- a/templates/default/styleguide.twig +++ b/templates/default/styleguide.twig @@ -7,4 +7,12 @@ -
{% trans with { '%name%': name|e } %}Hello, %name%{% endtrans %}\ No newline at end of file +
{% trans with { '%name%': name|e } %}Hello, %name%{% endtrans %}+ + +