SQLQueryBuilder by Koenig 11.10.2017 / 16:53 | | GreeNLine Пользователь Сейчас: Offline
Имя: Саша Регистрация: 02.02.2012
| Обновил репозиторий. Как и обещал, показываю свою обёртку для PDO. (привет с Java) https://github.com/ebalazhabagadyuku/dbcПример настройки (надеюсь понятно): Открыть спойлер Закрыть спойлер $app = new App(function($c) {
$c['_dbcUrl'] = 'mysql://root:@localhost/lol';
$c->register(new \framework\providers\DbcServiceProvider());
});
Открыть спойлер Закрыть спойлер // register mysql driver
DriverManager::register('mysql', \framework\dbc\Driver\MysqlDriver::class);
$app['dbc'] = $app->singleton(
function($c) {
return DriverManager::getConnection($c['_dbcUrl']);
});
//$app['dbc']->getPdo()->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC);
$app['dbc']->getPdo()->setAttribute(\PDO::ATTR_CURSOR, \PDO::CURSOR_SCROLL);
$app['dbc']->executeQuery('SET NAMES utf8;');
Пример использования (внутри моего приложения): Открыть спойлер Закрыть спойлер /** @var string */
$token = $this->request->cookies()->get('user');
if (null !== $token) {
/** @var \framework\dbc\ResultSet */
$rs = $this->app['dbc']->executeQuery('SELECT u.* FROM sessions s
LEFT JOIN users u ON u.id=s.user_id WHERE s.token=?;', [
_e((string)$token)
]);
if (0 != $rs->getCount()) {
$user = [
'id' => $rs->getInt('id'),
'login' => $rs->getString('login'),
'password' => $rs->getString('password')
];
$this->user = $user;
if ( ! $rs->isNull('block') ) {
$this->response->setCookie(new Cookie('user', null, 0));
$this->redirect('/user/signIn');
}
$this->app['dbc']->executeQuery('UPDATE users
SET last_updated_at=UNIX_TIMESTAMP() WHERE id=?;', [
$user['id']
]);
$this->assign('user', $user);
}
}
Спасибо за внимание! Были мысли по поводу того, чтобы создать отдельные скалярные типы. Изменено GreeNLine (11.10 / 16:58) (всего 2 раза) |
11.10.2017 / 18:21 | | Дневник_Володи Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| GreeNLine, это же самая примитивная обёртка. Берём объект PDO, оборачиваем его, затем берём ResultSet, оборачиваем и его. При этом навешиваем в оба класса пару методов для удобства и всё. Такое каждый велосипедист писал и пишет, что уникального-то?
__________________
let live |
11.10.2017 / 18:35 | | aRiGaTo Пользователь Сейчас: Offline
Имя: Snork Откуда: Yerevan Регистрация: 03.02.2010
| Цитата GreeNLine: Я всегда был одного мнения о буилдере - бред Билдеры запросов упрощают работу с SQL. Одно дело тупо писать голый запрос, а другое - при написании запроса использовать всю мощь IDE и языка, т.е. автодополнение, подсветка, соответствие названий полей и их типов (если речь о некотором подобии ORM). __________________
don't tread on me |
11.10.2017 / 18:43 | | GreeNLine Пользователь Сейчас: Offline
Имя: Саша Регистрация: 02.02.2012
| Цитата Дневник_Володи: GreeNLine, это же самая примитивная обёртка. Берём объект PDO, оборачиваем его, затем берём ResultSet, оборачиваем и его. При этом навешиваем в оба класса пару методов для удобства и всё. Такое каждыТвоя правда.
|
11.10.2017 / 22:16 | | Koenig Модератор форума Сейчас: Offline
Имя: Дмитрий Откуда: Калининград(Koenigsberg) Регистрация: 23.01.2011
| GreeNLine, сам PDO удобный, вот Mysqli кривой, особенно при работе с plaseholders
__________________
Магистр Мёда |
11.10.2017 / 22:19 | | Koenig Модератор форума Сейчас: Offline
Имя: Дмитрий Откуда: Калининград(Koenigsberg) Регистрация: 23.01.2011
| aRiGaTo, вот и я про то же
__________________
Магистр Мёда |
12.10.2017 / 11:34 | | Дневник_Володи Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Koenig, idiORM смотрел? Нравилась мне эта штука. Может почерпнёшь что. Там поверх idiORM потом Active Record реализацию сделали http://j4mie.github.io/idiormandparis/ __________________
let live Изменено Дневник_Володи (12.10 / 11:35) (всего 1 раз) |
12.10.2017 / 15:41 | | GreeNLine Пользователь Сейчас: Offline
Имя: Саша Регистрация: 02.02.2012
| Цитата Дневник_Володи: Koenig, idiORM смотрел? Нравилась мне эта штука. Может почерпнёшь что. Там поверх idiORM потом Active Record реализацию сделали http://j4mie.github.io/idiorхм) интересная вещь) |
12.10.2017 / 21:34 | | Koenig Модератор форума Сейчас: Offline
Имя: Дмитрий Откуда: Калининград(Koenigsberg) Регистрация: 23.01.2011
| Дневник_Володи, конечно смотрел, еще во времена mysqli, но она уже старенькая
__________________
Магистр Мёда |
19.10.2017 / 02:17 | | GreeNLine Пользователь Сейчас: Offline
Имя: Саша Регистрация: 02.02.2012
| Написал небольшую конструкцию. Простенько конечно, извиняюсь. // Модель Открыть спойлер Закрыть спойлер <?php
namespace framework;
use framework\db\builder;
/**
* @author 3kZO
*/
class Model
{
/** @var \framework\db\Connection */
protected $db;
/** @var string */
protected $table;
/** @var string */
protected $persistenceClass;
/** @var \framework\db\Builder */
private $builder;
public function __construct() {
/** @var \framework\Container */
$container = Framework::app()->getContainer();
$this->db = $container['db'];
}
public function getBuilder() {
if (null === $this->builder) {
$this->builder = new Builder($this->db);
$this->builder->persist($this->persistenceClass);
$this->builder->from([
$this->table
]);
}
return $this->builder;
}
public function find() {
return $this->getBuider()
->select([
$this->table . '.*'
]);
}
public function findBy($expr, array $args = []) {
return $this->find()
->where()
->expr($expr, $args)
->find();
}
public function findById($id) {
return $this->findBy($this->table . '.id = ?', [
(int)$id
]);
}
public function update($id, array $values = []) {
$expr = [];
$bindArgs = [];
foreach($values as $column => $value) {
$expr[] = $column . ' = ?';
$bindArgs[] = $value;
}
return $this->getBuilder()
->expr(implode(', ', $expr), $bindArgs)
->where()
->expr('id = ?', [
(int)$id
])
->update();
}
public function delete($id) {
return $this->getBuider()
->where()
->expr('id = ?', [
(int)$id
])
->delete();
}
}
// Буилдер Открыть спойлер Закрыть спойлер <?php
namespace framework\db;
use framework\db\Connection;
/**
* @author 3kZO
*/
class Builder
{
/** @var \framework\db\Connection */
private $db;
/** @var string[] */
private $from;
/** @var string[] */
private $columns;
/** @var string[] */
private $bindArgs = [];
/** @var string[] */
private $breadcrumbs = [];
/** @var string */
private $persistenceClass;
public function __construct(
Connection $db
) {
$this->db = $db;
}
public function persist($class) {
$this->persistenceClass = (string)$class;
return $this;
}
public function select(array $columns) {
$this->columns = [];
foreach($columns as $column)
$this->columns[] = (string)$column;
return $this;
}
public function from(array $tables) {
$this->from = [];
foreach($tables as $table)
$this->from[] = (string)$table;
return $this;
}
public function leftJoin(...$args) {
$this->breadcrumbs[] = 'LEFT JOIN ' . (string)$args[0] . ' ON';
return $this;
}
public function where() {
$this->breadcrumbs[] = 'WHERE';
return $this;
}
public function expr(...$args) {
$this->breadcrumbs[] = (string)$args[0];
if (isset($args[1]))
foreach($args[1] as $value)
$this->bindArgs[] = (string)$value;
return $this;
}
public function having() {
$this->breadcrumbs[] = 'HAVING';
return $this;
}
public function orderBy($string) {
$this->breadcrumbs[] = 'ORDER BY ' . (string)$string;
return $this;
}
public function groupBy($string) {
$this->breadcrumbs[] = 'GROUP BY ' . (string)$string;
return $this;
}
public function limit($offset, $maxRows = false) {
$this->breadcrumbs[] = 'LIMIT '
. ($maxRows
? $offset . ', ' . $maxRows
: $offset);
return $this;
}
public function getGeneratedSql() {
$sql = [];
$sql[] = implode(' ', $this->breadcrumbs);
return implode(' ', $sql) . ';';
}
public function find() {
$sql = [];
$sql[] = 'SELECT ' . implode(', ', $this->columns) . ' FROM ' . implode(', ', $this->from);
$sql[] = $this->getGeneratedSql();
$rs = $this->db->executeQuery(implode(' ', $sql), $this->bindArgs);
if (0 == $rs->getRowCount())
return;
$rs->first();
$persistenceClass = $this->persistenceClass;
$persistence = new $persistenceClass();
foreach($persistence->keys() as $key)
$persistence->__data[$key] = $rs->get($key);
return $persistence;
}
public function findAll() {
$sql = [];
$sql[] = 'SELECT ' . implode(', ', $this->columns) . ' FROM ' . implode(', ', $this->from);
$sql[] = $this->getGeneratedSql();
$rs = $this->db->executeQuery(implode(' ', $sql), $this->bindArgs);
if (0 == $rs->getRowCount())
return;
$list = [];
while($rs->next()) {
$persistenceClass = $this->persistenceClass;
$persistence = new $persistenceClass();
foreach($persistence->keys() as $key)
$persistence->__data[$key] = $rs->get($key);
$list[] = $persistence;
}
return $list;
}
public function update() {
$sql = [];
$sql[] = 'UPDATE ' . implode(', ', $this->from) . ' SET';
$sql[] = $this->getGeneratedSql();
$rs = $this->db->executeQuery(implode(' ', $sql), $this->bindArgs);
return $rs->getRowCount();
}
public function delete() {
$sql = [];
$sql[] = 'DELETE FROM ' . implode(', ', $this->from);
$sql[] = $this->getGeneratedSql();
$rs = $this->db->executeQuery(implode(' ', $sql), $this->bindArgs);
return $rs->getRowCount();
}
}
// Сущность Открыть спойлер Закрыть спойлер <?php
namespace framework\db;
/**
* @author 3kZO
*/
class Entity
{
public $__data;
public function keys() {
return array_keys($this->__data);
}
public function __get($key) {
return array_key_exists($key, $this->__data) ? $this->__data[$key] : null;
}
public function __set($key, $val) {
if (array_key_exists($key, $this->__data))
$this->__data[$key] = $val;
}
}
// Пример сущности Открыть спойлер Закрыть спойлер <?php
namespace entities;
use framework\db\Entity;
/**
* @author 3kZO
*/
class User extends Entity
{
public $__data = [
'id' => null,
'login' => null,
'password' => null,
];
}
// Пример модели Открыть спойлер Закрыть спойлер <?php
namespace models;
use framework\Model;
/**
* @author 3kZO
*/
class User extends Model
{
protected $table = 'users';
protected $persistenceClass = \entities\User::class;
}
Пытался повторить java ebean на php. |
Всего сообщений: 67 Фильтровать сообщения Поиск по теме
|