208 lines
5.9 KiB
PHP
208 lines
5.9 KiB
PHP
<?php
|
|
|
|
namespace Rmphp\Storage;
|
|
|
|
use Rmphp\Storage\Entity\EntityInterface;
|
|
use Rmphp\Storage\Exception\RepositoryException;
|
|
use Rmphp\Storage\Mysql\MysqlRepositoryInterface;
|
|
use Rmphp\Storage\Mysql\MysqlResultData;
|
|
use Rmphp\Storage\Mysql\MysqlStorageInterface;
|
|
use Rmphp\Storage\Repository\AbstractRepository;
|
|
|
|
abstract class AbstractMysqlRepository extends AbstractRepository implements MysqlRepositoryInterface {
|
|
|
|
public const DEBUG = false;
|
|
public const TABLE = null;
|
|
public const ENTITY = null;
|
|
|
|
private string $table;
|
|
private string $entity;
|
|
private bool $debug;
|
|
|
|
public function __construct(
|
|
public readonly MysqlStorageInterface $mysql
|
|
) {}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function createFromResult(string $class, bool|MysqlResultData $result, callable $function = null): mixed {
|
|
if($result instanceof MysqlResultData) {
|
|
$val = (isset($function)) ? $function($result->fetchOne()) : $result->fetchOne();
|
|
$out = $this->createFromData($class, $val);
|
|
}
|
|
return $out ?? null;
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function createListFromResult(string $class, bool|MysqlResultData $result, callable $function = null): array {
|
|
if($result instanceof MysqlResultData) {
|
|
foreach($result->fetch() as $resultValue) {
|
|
$val = (isset($function)) ? $function($resultValue) : $resultValue;
|
|
$out[] = $this->createFromData($class, $val);
|
|
}
|
|
}
|
|
return $out ?? [];
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function getEntityById(int $id, string $table = null): mixed {
|
|
if(!isset($table)) $table = $this->getTable();
|
|
if($result = $this->mysql->findById($table, $id)) $out = $this->createFromData($this->getEntityClass(), $result);
|
|
return $out ?? null;
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function saveEntity(EntityInterface $object, string $table = null) : mixed {
|
|
if(!isset($table)) $table = $this->getTable();
|
|
$in = $this->getProperties($object, function ($value){
|
|
return (is_string($value)) ? $this->mysql->escapeStr($value) : $value;
|
|
});
|
|
if($this->isDebug()) {$this->debug($object, $in, $table, ...$this->getDebugExtraData()); exit;}
|
|
try {
|
|
if (!empty($object->getId()) && !empty($this->mysql->findById($table, $object->getId()))) {
|
|
$this->mysql->updateById($table, $in, $object->getId());
|
|
return $object->getId();
|
|
} else {
|
|
$this->mysql->insert($table, $in);
|
|
return (is_string($object->getId())) ? $object->getId() : $this->mysql->mysql()->insert_id;
|
|
}
|
|
} catch (\Throwable $throwable) {throw new RepositoryException($throwable->getMessage());}
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function saveData(array $data, string $table = null, string $primaryKey = 'id') : mixed {
|
|
if(!isset($table)) $table = $this->getTable();
|
|
$in = array_map(function ($value){
|
|
return (is_string($value)) ? $this->mysql->escapeStr($value) : $value;
|
|
}, $data);
|
|
if($this->isDebug()) {$this->debug($data, $in, $table, ...$this->getDebugExtraData()); exit;}
|
|
try {
|
|
if (!empty($data[$primaryKey]) && !empty($this->mysql->findById($table, $data[$primaryKey], $primaryKey))) {
|
|
$this->mysql->updateById($table, $in, $data[$primaryKey]);
|
|
return $data[$primaryKey];
|
|
} else {
|
|
$this->mysql->insert($table, $in);
|
|
return (is_string($data[$primaryKey])) ? $data[$primaryKey] : $this->mysql->mysql()->insert_id;
|
|
}
|
|
} catch (\Throwable $throwable) {throw new RepositoryException($throwable->getMessage());}
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function saveEntityGroup(array $objects, string $table = null): array {
|
|
try{
|
|
$this->mysql->mysql()->begin_transaction();
|
|
foreach($objects as $object) $id[] = $this->saveEntity($object, $table);
|
|
$this->mysql->mysql()->commit();
|
|
return $id ?? [];
|
|
}
|
|
catch (\Exception $exception){
|
|
$this->mysql->mysql()->rollback();
|
|
throw new RepositoryException($exception->getMessage());
|
|
}
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function saveDataGroup(array $objects, string $table = null, string $primaryKey = 'id'): array {
|
|
try{
|
|
$this->mysql->mysql()->begin_transaction();
|
|
foreach($objects as $object) $id[] = $this->saveData($object, $table, $primaryKey);
|
|
$this->mysql->mysql()->commit();
|
|
return $id ?? [];
|
|
}
|
|
catch (\Exception $exception){
|
|
$this->mysql->mysql()->rollback();
|
|
throw new RepositoryException($exception->getMessage());
|
|
}
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function deleteEntity(EntityInterface $object, string $table = null) : bool {
|
|
if(!isset($table)) $table = $this->getTable();
|
|
if(!empty($object->getId())){
|
|
return $this->mysql->deleteById($table, $object->getId());
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function getStorageLogs() : array {
|
|
return $this->mysql->getLogs();
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function setTable(string $table) : void {
|
|
$this->table = $table;
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function setEntity(string $entity) : void {
|
|
$this->entity = $entity;
|
|
}
|
|
|
|
|
|
/** @inheritDoc */
|
|
public function setDebug(bool $debug) : void {
|
|
$this->debug = $debug;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return string
|
|
* @throws RepositoryException
|
|
*/
|
|
private function getTable() : string {
|
|
if(!empty($this->table)) return $this->table;
|
|
if(!empty(static::TABLE)) return static::TABLE;
|
|
throw new RepositoryException("Имя таблицы не задано");
|
|
}
|
|
|
|
|
|
/**
|
|
* @return string
|
|
* @throws RepositoryException
|
|
*/
|
|
private function getEntityClass() : string {
|
|
if(!empty($this->entity)) return $this->entity;
|
|
if(!empty(static::ENTITY)) return static::ENTITY;
|
|
throw new RepositoryException("Не указан объект");
|
|
}
|
|
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
private function isDebug(): bool {
|
|
if(!empty($this->debug)) return $this->debug;
|
|
if(!empty(static::DEBUG)) return static::DEBUG;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
protected function getDebugExtraData() : array {
|
|
return [$this->getRepositoryStack(), $this->getClassesCache(), $this->getAttributesObjectsCache()];
|
|
}
|
|
|
|
/**
|
|
* @param ...$arg
|
|
* @return void
|
|
*/
|
|
protected function debug(...$arg) : void {
|
|
if(function_exists('dd')) dd(...$arg);
|
|
if(function_exists('vdd')) vdd(...$arg);
|
|
var_dump(...$arg);
|
|
}
|
|
|
|
}
|