File: /var/www/limestate-api/lib/dblib/DbModel.php
<?php
/**
* Модель для работы с БД
*/
class Db_Model
{
/** @var iDb_Driver */
static $db = null;
static $table_name = '';
static $cache = array();
/**
* Возвращает идентификатор созданного объекта или массив идентификаторов
*
* @param array массив содержащий данные для сохранения в базу
* @param bool $returning возвращать идентификатор
* @return int|array
*/
public static function create($data, $returning = false)
{
return self::$db->insert(static::$table_name, array_keys($data), [array_values($data)], $returning);
}
/**
* Возвращает количество записей по условию
*
* @param array|string $where условие
* @param string $server сервер БД read|write
* @return int
*/
public static function count($where = array(), $server = null)
{
$query = self::$db->select('COUNT(id)')->from(static::$table_name);
if ($where) {
if (is_array($where)) {
$query->where(self::$db->prepareWhere($where));
} else if (is_string($where) ) {
$query->where($where);
}
}
return (int) $query->fetchOne($server);
}
/**
* Возвращает объект записи по идентификатору
*
* @param int $id идентификатор записи
* @param string $server сервер БД read|write
* @return object|bool
*/
public static function find($id, $server = null)
{
if (!$id = (int) $id) {
return false;
}
if ($server === Db_Driver::SERVER_WRITE || !($result = static::findFromCache($id))) {
$query = self::$db->select()->from(static::$table_name)->where('id = ?', $id);
$result = static::$cache[static::$table_name][$id] = $query->fetchRow($server);
}
return $result ? : false;
}
public static function exists($id, $server = null)
{
if (!$id = (int) $id) {
return false;
}
return (bool) self::$db->select('1')->from(static::$table_name)->where('id = ?', $id)->fetchOne();
}
/**
* Возвращает объект записи из кэша по идентификатору, либо false если запись отсутствует - false
*
* @param int $id идентификатор запись
* @return object|bool
*/
private static function findFromCache($id)
{
// todo: implement cache!
return false; //isset(static::$cache[static::$table_name][$id]) ? static::$cache[static::$table_name][$id] : false;
}
/**
* Возвращает массив объектов записей
*
* @param string $sql запрос
* @param array $values массив значений, подставляющийся в запрос
* @param string $server сервер БД read|write
* @return array
*/
public static function find_by_sql($sql, $values = null, $server = null)
{
if ($values !== null && is_array($values) && !empty($values)) {
self::$db->prepareData($sql, $values);
}
return self::$db->fetchAll($sql, $server);
}
/**
* Возвращает объект первой записи соотв. запросу
*
* @param string $sql запрос
* @param array $values массив значений, подставляющийся в запрос
* @param string $server сервер БД read|write
* @return object
*/
public static function first($sql, $values = null, $server = null)
{
if ($values !== null && is_array($values) && !empty($values)) {
self::$db->prepareData($sql, $values);
}
$result = self::$db->fetchRow($sql, $server);
return $result;
}
/**
* Выполняет запрос в БД
*
* @param string $sql запрос
* @param array $values массив значений, подставляющийся в запрос
* @param string $server сервер БД read|write
* @return mixed
*/
protected static function query($sql, $values = null, $server = null)
{
if ($values !== null && is_array($values) && !empty($values)) {
self::$db->prepareData($sql, $values);
}
return self::$db->query($sql, $server);
}
/**
* Обновляет записи по условию. Возвращает кол-во обновленных записей.
*
* @param array $data массив данных обновляемых записей, где ключ - столбец, а значение - значение
* @param array|string $where массив или строка условий
* @return int
*/
public static function update($data, $where)
{
return self::$db->update(static::$table_name, $data, $where);
}
/**
* Удаляет записи по условию
*
* @param array|string $where массив или строка условий
* @param bool $returning возвращать удаленные записи
* @return bool|array
*/
protected static function delete($where, $returning = false)
{
return self::$db->delete(static::$table_name, $where, $returning);
}
}