Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- abstract class ORM_DataBase {
- public $pdo;
- protected $_queryCache = [];
- protected $_columnCache = [];
- protected $_rowCache = [];
- /*
- Должна возвращать структуру типа этой:
- [
- 'columns' =>
- [
- 0 => 'id',
- 1 => 'cat_id',
- 2 => 'author_id',
- 3 => 'title',
- 4 => 'content',
- ],
- 'pk' => 'id',
- 'foreign_keys' =>
- [
- 0 =>
- [
- 'name' => 'category',
- 'key' => 'cat_id',
- 'ref_table' => 'categories',
- 'ref_key' => 'id',
- ],
- ],
- ]
- */
- abstract public function columns($table);
- // переопределить в случае необходимости
- public function quoteName($name) {
- return $this->quote($name);
- }
- public function __construct(PDO $pdo) {
- $this->pdo = $pdo;
- }
- // возвращает ряд в виде объекта ActiveRecord
- public function row($table) {
- $t = $this;
- $columns = isset($t->_columnCache[$table]) ?
- $t->_columnCache[$table] :
- $t->_columnCache[$table] = $t->columns($table);
- extract($columns);
- $r = new ORM_Row($t, $table, $pk, $columns, $foreign_keys);
- return $r;
- }
- // ищет одну запись по $id, если $k не указан, то при поиске использует
- // primary key
- public function find($table, $id, $k=null) {
- $t = $this;
- $cache = &$t->_rowCache;
- if ( isset($t->_rowCache[$table][$k][$id]) ) {
- return $t->_rowCache[$table][$k][$id];
- }
- $row = $t->row($table);
- $row->load($id, $k);
- return $t->_rowCache[$table][$k][$id] = $row;
- }
- // ! кешируются только вложенные ряды.
- public function findMany($table, $where=1, $limit=25, $offset=0, $order=1) {
- $t = $this;
- $objects = [];
- $tbl = $t->quotename($table);
- $arr = $t->get("SELECT * FROM $tbl WHERE $where ORDER BY $order LIMIT $offset,$limit");
- foreach ($arr as $v) {
- $row = $t->row($table);
- $row->setup($v);
- $objects[] = $t->_rowCache[$table][$row->pk()][$row->id()] = $row;
- }
- return $objects;
- }
- public function execute($query, array $bindings=[]) {
- $t = $this;
- if (ORM::DEBUG) {
- echo '<br><b>SQL запрос:</b>';
- echo dump($query);
- }
- $h = md5($query);
- if (isset($t->_queryCache[$h])) {
- if (ORM::DEBUG) {
- echo '<br>Берем из кеша.';
- }
- $s = $t->_queryCache[$h];
- }
- else {
- $s = $t->pdo->prepare($query);
- $t->_queryCache[$h] = $s;
- }
- $s->execute($bindings);
- preg_match('/^\s*(\w+)/', $query, $m);
- $action = strtolower($m[1]);
- if ($action == 'update' or $action == 'delete') {
- return $s->rowCount();
- }
- if ($action == 'insert') {
- return $t->lastInsertId();
- }
- return $s;
- }
- public function get($query, array $bindings=[],
- $fetch_type=ORM::FETCH_ALL) {
- $r = $this->execute($query, $bindings);
- if ($fetch_type & ORM::FETCH_COLUMN) {
- return $r->fetchColumn();
- }
- if ($fetch_type & ORM::FETCH_ONE) {
- return $r->fetch(PDO::FETCH_ASSOC);
- }
- return $r->fetchAll(PDO::FETCH_ASSOC);
- }
- public function one($query, array $bindings=[]) {
- return $this->get($query, $bindings, ORM::FETCH_ONE);
- }
- public function col($query, array $bindings=[]) {
- return $this->get($query, $bindings, ORM::FETCH_COLUMN);
- }
- public function count($table, $where=1, array $bindings=[]) {
- $t = $this;
- $tbl = $t->quotename($table);
- $q = "SELECT COUNT(*) FROM $tbl WHERE $where";
- return (int) $t->col($q, $bindings);
- }
- // например нужно проверить зарегистрирован ли пользователь с таким
- // именем, конечно можно попытаться вставить запись INSERT'ом, но
- // так увеличится счетчик id.
- public function noexists($table, $k, $v) {
- return !$this->count($table, $this->quotename($k) . '=?', [$v,]);
- }
- public function add($table, array $data) {
- $t = $this;
- $columns = [];
- $values = [];
- $keys = array_keys($data);
- foreach ($keys as $v) {
- $columns[] = $t->quotename($v);
- $values[] = ":$v";
- }
- $columns = implode(',', $columns);
- $values = implode(',', $values);
- $tbl = $t->quotename($table);
- $q = "INSERT INTO $tbl ($columns) VALUES ($values)";
- return $t->execute($q, $data);
- }
- public function update($table, array $data, $where=1,
- array $bindings=[]) {
- $t = $this;
- $set = [];
- $is_l = is_list($bindings);
- $bindings = array_merge($is_l ? array_values($data) : $data,
- $bindings);
- $keys = array_keys($data);
- foreach ($keys as $v) {
- // подстраитваемся под стиль плейсхолдеров
- $set[] = $t->quotename($v) . '=' . ($is_l ? '?' : ":$v");
- }
- $set = implode(',', $set);
- $tbl = $t->quotename($table);
- return $t->execute("UPDATE $tbl SET $set WHERE $where", $bindings);
- }
- public function delete($table, $where=1, array $bindings=[]) {
- $t = $this;
- $tbl = $t->quotename($table);
- return $t->execute("DELETE FROM $tbl WHERE $where", $bindings);
- }
- // при смене базы следует вручную сбросить кеш
- public function clearCache() {
- $this->_queryCache = [];
- $this->_columnCache = [];
- $this->_rowCache = [];
- }
- /*
- * Обертки над PDO-шными методами.
- */
- public function query($query) {
- return $this->pdo->query($query);
- }
- public function exec($query) {
- return $this->pdo->exec($query);
- }
- public function quote($s) {
- return $this->pdo->quote($s);
- }
- public function commit() {
- return $this->pdo->commit();
- }
- public function rollback() {
- return $this->pdo->rollback();
- }
- public function lastInsertId() {
- return $this->pdo->lastInsertId();
- }
- }
- /* ---------------------------- 78 characters ----------------------------- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement