| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- <?php
- namespace Ipol\DPD\DB;
- /**
- * Абстрактный класс реализующий взаимодействие с одной таблицей
- */
- abstract class AbstractTable implements TableInterface
- {
- protected $connection;
- /**
- * Конструктор класса
- *
- * @param \Ipol\DPD\DB\ConnectionInterface
- */
- public function __construct(ConnectionInterface $connection)
- {
- $this->connection = $connection;
- }
- /**
- * Возвращает соединение с БД
- *
- * @return \Ipol\DPD\DB\ConnectionInterface
- */
- public function getConnection()
- {
- return $this->connection;
- }
- /**
- * Возвращает конфиг
- *
- * @return \Ipol\DPD\Config\ConfigInterface
- */
- public function getConfig()
- {
- return $this->getConnection()->getConfig();
- }
- /**
- * Возвращает инстанс PDO
- *
- * @return \PDO
- */
- public function getPDO()
- {
- return $this->getConnection()->getPDO();
- }
- /**
- * Возвращает имя класса модели
- *
- * @return array
- */
- public function getModelClass()
- {
- return \Ipol\DPD\DB\Model::class;
- }
- /**
- * Возвращает инстанс модели ассоциированной с таблицой
- *
- * @return \Ipol\DPD\DB\Model
- */
- public function makeModel($id = false)
- {
- $classname = $this->getModelClass();
- return new $classname($this, $id);
- }
- /**
- * Создание таблицы при необходимости
- *
- * @return void
- */
- public function checkTableSchema()
- {
- $sqlPath = sprintf('%s/db/install/%s/%s.sql',
- $this->getConfig()->get('DATA_DIR'),
- $this->getConnection()->getDriver(),
- $this->getTableName()
- );
- if (file_exists($sqlPath)) {
- $sql = file_get_contents($sqlPath);
- $this->getPDO()->query($sql);
- }
- }
-
- /**
- * Добавление записи
- *
- * @param array $values
- *
- * @return bool
- */
- public function add($values)
- {
- $fields = array_keys($values);
- $values = $this->prepareParms($values);
- $placeholders = array_keys($values);
-
- $sql = 'INSERT INTO '
- . $this->getTableName()
- . ' ('. implode(',', $fields) .') VALUES ('
- . implode(',', $placeholders) .')'
- ;
- return $this->getPDO()
- ->prepare($sql)
- ->execute($values)
- ? $this->getPDO()->lastInsertId()
- : false;
- }
- /**
- * Обновление записи
- *
- * @param int $id
- * @param array $values
- *
- * @return bool
- */
- public function update($id, $values)
- {
- $fields = array_keys($values);
- $values = $this->prepareParms($values);
- $placeholders = array_keys($values);
-
- $sql = 'UPDATE '. $this->getTableName() .' SET ';
- foreach ($fields as $i => $field) {
- $sql .= $field .'='. $placeholders[$i] .',';
- }
- $sql = trim($sql, ',') . ' WHERE id = :id_where';
- return $this->getPDO()
- ->prepare($sql)
- ->execute(array_merge(
- $values,
- [':id_where' => $id]
- ));
- }
- /**
- * Удаление записи
- *
- * @param int $id
- *
- * @return bool
- */
- public function delete($id)
- {
- $sql = 'DELETE FROM '. $this->getTableName .' WHERE id = :id';
- return $this->getPDO()
- ->prepare($sql)
- ->execute([':id' => $id]);
- }
-
- /**
- * Выборка записей
- *
- * $parms = "id = 1" or
- * $parms = [
- * 'select' => '*',
- * 'where' => 'id = :id',
- * 'order' => 'id asc',
- * 'limit' => '0,1',
- * 'bind' => [':id' => 1]
- * ]
- *
- * @param string|array $parms
- *
- * @return \PDOStatement
- */
- public function find($parms = [])
- {
- $parms = is_array($parms)
- ? $parms
- : [
- 'where' => $parms,
- ]
- ;
-
- $sql = sprintf('SELECT %s FROM %s %s %s %s',
- isset($parms['select']) ? $parms['select'] : '*',
- $this->getTableName(),
- isset($parms['where']) ? "WHERE {$parms['where']}" : '',
- isset($parms['order']) ? "ORDER BY {$parms['order']}" : '',
- isset($parms['limit']) ? "LIMIT {$parms['limit']}" : ''
- );
- $query = $this->getPDO()->prepare($sql);
- return $query->execute($parms['bind'])
- ? $query
- : false
- ;
- }
- /**
- * Выборка одной записи, псевдномим над find limit 0,1
- *
- * @param int|string|array $parms
- *
- * @return array
- */
- public function findFirst($parms = [])
- {
- if (is_numeric($parms)) {
- $parms = ['where' => 'id = :id', 'bind' => ['id' => $parms]];
- } elseif (is_string($parms)) {
- $parms = ['where' => $parms];
- }
- $parms['limit'] = '0,1';
- return $this->find($parms)->fetch();
- }
- /**
- * Составляет массив bind-values для передачи в PDO
- *
- * @param array $parms
- *
- * @return array
- */
- protected function prepareParms($parms)
- {
- $ret = array();
- foreach ($parms as $k => $v) {
- $ret[':'. $k] = $v;
- }
- return $ret;
- }
- }
|