Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- abstract class ORM_Abstract {
- public $pdo;
- protected $_tablePrefix;
- protected $_statementCache = [];
- abstract public function quoteName($name);
- abstract public function getMeta($table);
- public function __construct(PDO $pdo, $table_prefix='') {
- $this->pdo = $pdo;
- $this->_tablePrefix = $table_prefix;
- }
- public function record($table, $id=null) {
- $meta = $this->getmeta($table);
- $rec = new ORM_Record($this, $table);
- if (func_num_args() > 1 && !$rec->load($id))
- return false;
- return $rec;
- }
- public function load($table, $id) {
- $o = $this->disponse($table);
- return $o->load($id) ? $o: false;
- }
- public function query($query, array $bindings=[]) {
- // '?_' автоматически заменяется на преффикс для таблиц.
- $query = str_replace('?_', $this->_tablePrefix, $query);
- echo dump($query);
- $h = md5($query);
- if (isset($this->_statementCache[$h])) {
- list($s, $t) = $this->_statementCache[$h];
- }
- else {
- $s = $this->pdo->prepare($query);
- preg_match('/^\s*(\w+)/', $query, $m);
- $t = strtolower($m[1]);
- $this->_statementCache[$h] = [$s, $t];
- }
- $s->execute($bindings);
- if ($t == 'update' or $t == 'delete')
- return $s->rowCount();
- if ($t == 'insert')
- return $this->lastInsertId();
- return $s;
- }
- public function get($query, array $bindings=[],
- $fetch_type=ORM::FETCH_ALL) {
- $r = $this->query($query, $bindings);
- if ($fetch_type & ORM::FETCH_COLUMN)
- return $r->fetchColumn();
- if ($fetch_type & ORM::FETCH_ROW)
- return $r->fetch(PDO::FETCH_ASSOC);
- return $r->fetchAll(PDO::FETCH_ASSOC);
- }
- public function row($query, array $bindings=[]) {
- return $this->get($query, $bindings, ORM::FETCH_ROW);
- }
- public function column($query, array $bindings=[]) {
- return $this->get($query, $bindings, ORM::FETCH_COLUMN);
- }
- public function count($table, $where=1, array $bindings=[]) {
- $tbl = $this->fulltablename($table);
- $q = "SELECT COUNT(*) FROM $tbl WHERE $where";
- return (int) $this->column($q, $bindings);
- }
- public function insert($table, array $data) {
- if (!$data)
- return false;
- $t = $this;
- $keys = array_keys($data);
- foreach ($keys as $v) {
- $columns[] = $t->quotename($v);
- $values[] = ":$v";
- }
- $columns = implode(',', $columns);
- $values = implode(',', $values);
- $tbl = $t->fulltablename($table);
- $q = "INSERT INTO $tbl ($columns) VALUES ($values)";
- return $t->query($q, $data);
- }
- public function update($table, array $data, $where=1,
- array $bindings=[]) {
- if (!$data)
- return false;
- $t = $this;
- $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->fulltablename($table);
- return $t->query("UPDATE $tbl SET $set WHERE $where", $bindings);
- }
- public function delete($table, $where=1, array $bindings=[]) {
- $tbl = $this->fulltablename($table);
- return $this->query("DELETE FROM $tbl WHERE $where", $bindings);
- }
- public function commit() {
- return $this->pdo->commit();
- }
- public function rollback() {
- return $this->pdo->rollback();
- }
- public function lastInsertId() {
- return $this->pdo->lastInsertId();
- }
- public function fullTableName($table) {
- return $this->quotename($this->_tablePrefix . $table);
- }
- }
- /* ---------------------------- 78 characters ----------------------------- */
- <?php
- class ORM_Record extends object {
- protected $_db;
- protected $_table;
- protected $_primaryKey;
- protected $_columns;
- protected $_relations;
- protected $_primaryId;
- public function __construct(ORM_Abstract $db, $table,
- $columns, $relations) {
- $t = $this;
- $t->_db = $db;
- $t->_table = $table;
- $t->_columns = $columns;
- $t->_relations = $relations;
- }
- public function load($id) {
- $t = $this;
- $tbl = $t->_db->fulltablename($t->_table);
- $k = $t->_db->quotename($t->_primaryKey);
- $r = $t->_db->row("SELECT * FROM $tbl WHERE $k=?", [$id,]);
- if ($r) {
- $t->_data = $r;
- $t->_primaryId = $id;
- return true;
- }
- /*
- array (
- 'columns' =>
- array (
- 0 => 'id',
- 1 => 'cat_id',
- 2 => 'author_id',
- 3 => 'title',
- 4 => 'body',
- ),
- 'primary_key' => 'id',
- 'relations' =>
- array (
- 0 =>
- array (
- 'foreign_alias' => 'category',
- 'foreign_key' => 'cat_id',
- 'ref_table' => 'categories',
- 'ref_key' => 'id',
- ),
- ),
- ) */
- foreach ($t->_relations as $rel) {
- $t->_data[ ]
- }
- return false;
- }
- public function save() {
- $t = $this;
- $a = $t->_matchcolumns();
- if ($t->_primaryId) {
- $k = $t->_db->quotename($t->_primaryKey);
- $c = $t->_db->update($t->_table, $a, "$k=?", [$t->_primaryId,]);
- return (bool) $c;
- }
- $id = $t->_db->insert($t->_table, $a);
- if (!$id)
- return fase;
- $t->_primaryId = $id;
- return true;
- }
- public function trash() {
- $t = $this;
- $k = $t->_db->quotename($t->_primaryKey);
- $c = $t->_db->delete($t->_table, "$k=?", [$t->_primaryId,]);
- if ($c)
- $t->_data = null;
- return (bool) $c;
- }
- protected function _matchColumns() {
- $t = $this;
- $r = array();
- foreach ($t->_columns as $v) {
- if (isset($t->_data[$v])) {
- $r[$v] = $t->_data[$v];
- }
- }
- return $r;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement