/core/AROrm.php
PHP | 228 lines | 155 code | 34 blank | 39 comment | 10 complexity | 01429ff39e422e16b02cfb9892d42a9d MD5 | raw file
- <?php
- require_once ('MySqlDB.php');
- class AROrm
- {
- /***
- * @param $connectionString
- * @param $dbType - выбор типа БД, пока только MySql
- */
- public static function Initialize($dbType, $connectionString)
- {
- DB::Connect($connectionString);
- }
- }
- abstract class BaseEntity
- {
- private $_entityName;
- private $_data = ['id' => 0];
- //static $foreignKey = null;
- public function __construct()
- {
- $this->_entityName = get_called_class();
- }
- /***
- * @return array Возвращает массив из всех существующих сущностей
- */
- public static function FindAll()
- {
- $entityName = get_called_class();
- $query = "SELECT * FROM " . strtolower($entityName) . "s";
- $res = DB::ResultQuery($query);
- return self::toEntitysArray($res);
- }
- /***
- * @param $id - Идентификатор сущности
- * @return BaseEntity Возвращает сущность с Id = $id
- */
- public static function Find($id)
- {
- $id = intval($id);
- $entityName = get_called_class();
- $tableName = strtolower($entityName) . "s";
- $query = "SELECT * FROM " . $tableName .
- " WHERE id = $id LIMIT 1";
- $res = DB::ResultQuery($query);
- $entity = new $entityName;
- $entity->_data = $res[0];
- return $entity;
- }
- /***
- * Сохраняет изменения внесенные в сущность, либо создает новую сущность
- */
- public function Save()
- {
- //TODO: Make validation!!
- if ($this->_data['id'] == 0)
- {
- $keys = [];
- $values = [];
- foreach ($this->_data as $key => $value) {
- $keys[] = $key;
- $values[] = is_string($value) ? "'$value'" : $value;
- }
- $query = "INSERT INTO " . $this->getTableName() . " (" .
- implode(", ", $keys) . ") VALUES (" .
- implode(", ", $values) . ")";
- $this->_data['id'] = DB::LastInsertId();
- }
- else
- {
- $conds = [];
- foreach ($this->_data as $key => $value)
- {
- $conds[] = $key . "=" . (is_string($value) ? "'$value'" : $value);
- }
- $query = "UPDATE " . $this->getTableName() . " SET " .
- implode(", ", $conds) .
- " WHERE id = " . $this->_data['id'];
- }
- DB::Query($query);
- }
- /***
- * Удаляет текущую сущность
- */
- public function Delete()
- {
- $this->_delete($this->_data['id']);
- }
- /***
- * @param array $ids Массив идентификаторов элементов, подлежащих
- * удалению
- */
- public static function DeleteAtRang(array $ids)
- {
- foreach ($ids as $id)
- self::_delete($id);
- }
- /***
- * Устанавливает внешнюю связь с другой таблицей
- * @param $foreignKey
- * @param BaseEntity $referenceEntity
- */
- public static function JoinTo($foreignKey, BaseEntity $referenceEntity)
- {
- }
- private static function _delete($id)
- {
- $id = intval($id);
- $query = "DELETE FROM " . strtolower(get_called_class()) . "s WHERE id = " . $id;
- DB::Query($query);
- }
- private function getTableName()
- {
- return strtolower($this->_entityName) . "s";
- }
- private static function findByField($fieldNames, $values, $conditions)
- {
- $entityName = get_called_class();
- $query = "SELECT * FROM " . strtolower($entityName) . "s" .
- " WHERE " .
- $fieldNames[0] . (strstr($values[0], '%') ? " LIKE " : " ") .
- (strstr($values[0], '%') ? "'$values[0]'" : $values[0]);
- $i = 1;
- foreach ($conditions as $cond)
- {
- $query .= " $cond ";
- $query .= $fieldNames[$i] . (strstr($values[$i], '%') ? " LIKE " : " ") .
- (strstr($values[$i], '%') ? "'$values[$i]'" : $values[$i]);
- $i++;
- }
- $res = DB::ResultQuery($query);
- return self::toEntitysArray($res);
- }
- private static function toEntitysArray(array $array)
- {
- $entityName = get_called_class();
- $entitys = [];
- foreach ($array as $row)
- {
- $entity = new $entityName;
- $entity->_data = $row;
- $entitys[$row['id']] = $entity;
- }
- return $entitys;
- }
- /***
- * @param $name
- * @param $arguments
- * @return array
- * @throws Exception
- *
- * Как вариант можно произвести выборку по условию, например функция вида
- * Find_by_strField_and_intField("%lo", "=100") - равносильна запрову SQL вида
- * SELECT * FROM tableName WHERE strField LIKE '%lo' AND intField =100;
- */
- public static function __callStatic($name, $arguments)
- {
- $arr = explode("_", $name);
- switch (strtolower($arr[0]))
- {
- case "find":
- {
- if (strtolower($arr[1]) == "by")
- {
- $conds = [];
- $fields = [];
- for ($i = 2; $i < count($arr); $i++)
- {
- if (in_array($arr[$i], ['and', 'or']))
- $conds[] = $arr[$i];
- else
- $fields[] = $arr[$i];
- }
- if (count($arguments) != count($fields))
- throw new Exception("Количество проверяемых полей и услоний не равно!");
- $res = self::findByField($fields, $arguments, $conds);
- return $res;
- }
- break;
- }
- }
- }
- function __set($name, $value)
- {
- //TODO: Make validation!!
- $this->_data[strtolower($name)] = $value;
- }
- function __get($name)
- {
- $name = strtolower($name);
- if (isset($this->_data[$name]))
- return $this->_data[$name];
- throw new Exception("Сущность не имеет поля {$name}");
- }
- }