3 Commits
10.0 ... 11.0

Author SHA1 Message Date
User
e2727c34e8 20250510#1 2025-05-10 14:20:24 +03:00
User
e16700fe8d 20250509#1 2025-05-09 23:00:16 +03:00
User
335c4d240c 20250427#1 2025-04-27 01:31:26 +03:00
10 changed files with 43 additions and 30 deletions

View File

@@ -10,12 +10,12 @@ Stable version
composer require rmphp/storage composer require rmphp/storage
``` ```
```bash ```bash
composer require rmphp/storage:"^10.0" composer require rmphp/storage:"^11.0"
``` ```
Dev version contains the latest changes Dev version contains the latest changes
```bash ```bash
composer require rmphp/storage:"10.x-dev" composer require rmphp/storage:"11.x-dev"
``` ```

View File

@@ -25,7 +25,7 @@ abstract class AbstractMysqlRepository extends AbstractRepository implements Mys
/** @inheritDoc */ /** @inheritDoc */
public function createFromResult(string $class, bool|MysqlResultData $result, callable $function = null): mixed { public function createFromResult(string $class, ?MysqlResultData $result, callable $function = null): mixed {
if($result instanceof MysqlResultData) { if($result instanceof MysqlResultData) {
$val = (isset($function)) ? $function($result->fetchOne()) : $result->fetchOne(); $val = (isset($function)) ? $function($result->fetchOne()) : $result->fetchOne();
$out = $this->createFromData($class, $val); $out = $this->createFromData($class, $val);
@@ -35,7 +35,7 @@ abstract class AbstractMysqlRepository extends AbstractRepository implements Mys
/** @inheritDoc */ /** @inheritDoc */
public function createListFromResult(string $class, bool|MysqlResultData $result, callable $function = null): array { public function createListFromResult(string $class, ?MysqlResultData $result, callable $function = null): array {
if($result instanceof MysqlResultData) { if($result instanceof MysqlResultData) {
foreach($result->fetch() as $resultValue) { foreach($result->fetch() as $resultValue) {
$val = (isset($function)) ? $function($resultValue) : $resultValue; $val = (isset($function)) ? $function($resultValue) : $resultValue;

View File

@@ -8,8 +8,8 @@ use Attribute;
class ValueObject { class ValueObject {
public function __construct( public function __construct(
public bool $autoPropertyName = false,
public ?string $propertyName = null, public ?string $propertyName = null,
public bool $firstProperty = false
) {} ) {}
} }

View File

@@ -5,4 +5,4 @@ namespace Rmphp\Storage\Attribute;
use Attribute; use Attribute;
#[Attribute(Attribute::TARGET_CLASS)] #[Attribute(Attribute::TARGET_CLASS)]
class ValueObjectAutoPropertyName {} class ValueObjectFirstProperty {}

View File

@@ -0,0 +1,14 @@
<?php
namespace Rmphp\Storage\Attribute;
use Attribute;
#[Attribute(Attribute::TARGET_CLASS)]
class ValueObjectPropertyName {
public function __construct(
public ?string $name = null,
) {}
}

View File

@@ -4,7 +4,6 @@ namespace Rmphp\Storage\Entity;
interface ValueObjectInterface { interface ValueObjectInterface {
public function getValue();
public function __toString(): string; public function __toString(): string;
} }

View File

@@ -16,21 +16,19 @@ interface MysqlRepositoryInterface extends RepositoryInterface {
/** /**
* @param string $class * @param string $class
* @param bool|MysqlResultData $result * @param MysqlResultData|null $result
* @param callable|null $function * @param callable|null $function
* @return mixed * @return mixed
* @throws RepositoryException
*/ */
public function createFromResult(string $class, bool|MysqlResultData $result, callable $function = null): mixed; public function createFromResult(string $class, ?MysqlResultData $result, callable $function = null): mixed;
/** /**
* @param string $class * @param string $class
* @param bool|MysqlResultData $result * @param MysqlResultData|null $result
* @param callable|null $function * @param callable|null $function
* @return array * @return array
* @throws RepositoryException
*/ */
public function createListFromResult(string $class, bool|MysqlResultData $result, callable $function = null): array; public function createListFromResult(string $class, ?MysqlResultData $result, callable $function = null): array;
/** /**
* @param int $id * @param int $id

View File

@@ -115,7 +115,7 @@ class MysqlStorage implements MysqlStorageInterface {
/** @inheritDoc */ /** @inheritDoc */
public function find(string $sql, int $ln=0, int $numPage=1, int $count=0): bool|MysqlResultData { public function find(string $sql, int $ln=0, int $numPage=1, int $count=0): ?MysqlResultData {
if ($ln > 1) { if ($ln > 1) {
$cnts = (!empty($count)) ? $count : $this->query($sql)->num_rows; $cnts = (!empty($count)) ? $count : $this->query($sql)->num_rows;
@@ -128,7 +128,7 @@ class MysqlStorage implements MysqlStorageInterface {
} }
$result = $this->query($sql.$limit); $result = $this->query($sql.$limit);
if (!$result || $result->num_rows == 0) return false; if (!$result || $result->num_rows == 0) return null;
$data = new MysqlResultData($result); $data = new MysqlResultData($result);
$data->count = $cnts ?? 0; $data->count = $cnts ?? 0;
@@ -137,17 +137,17 @@ class MysqlStorage implements MysqlStorageInterface {
} }
/** @inheritDoc */ /** @inheritDoc */
public function findOne(string $sql) : bool|MysqlResultData { public function findOne(string $sql) : ?MysqlResultData {
$result = $this->query($sql." limit 0, 1"); $result = $this->query($sql." limit 0, 1");
if (!$result || $result->num_rows == 0) return false; if (!$result || $result->num_rows == 0) return null;
return new MysqlResultData($result); return new MysqlResultData($result);
} }
/** @inheritDoc */ /** @inheritDoc */
public function findById(string $table, mixed $id, string $name = 'id') : bool|array { public function findById(string $table, mixed $id, string $name = 'id') : ?array {
$id = (is_numeric($id)) ? (int) $id : $this->escapeStr($id); $id = (is_numeric($id)) ? (int) $id : $this->escapeStr($id);
$result = $this->query("select * from ".$this->escapeStr($table)." where `$name`='$id' limit 0, 1"); $result = $this->query("select * from ".$this->escapeStr($table)." where `$name`='$id' limit 0, 1");
if (!$result || $result->num_rows == 0) return false; if (!$result || $result->num_rows == 0) return null;
$data = new MysqlResultData($result); $data = new MysqlResultData($result);
return $data->fetchOne(); return $data->fetchOne();
} }

View File

@@ -82,13 +82,13 @@ interface MysqlStorageInterface {
* @param int $count * @param int $count
* @return bool|MysqlResultData * @return bool|MysqlResultData
*/ */
public function find(string $sql, int $ln = 0, int $numPage = 1, int $count=0) : bool|MysqlResultData; public function find(string $sql, int $ln = 0, int $numPage = 1, int $count=0) : ?MysqlResultData;
/** /**
* @param string $sql * @param string $sql
* @return bool|array * @return bool|array
*/ */
public function findOne(string $sql) : bool|MysqlResultData; public function findOne(string $sql) : ?MysqlResultData;
/** /**
* @param string $table * @param string $table
@@ -96,7 +96,7 @@ interface MysqlStorageInterface {
* @param string $name * @param string $name
* @return bool|array * @return bool|array
*/ */
public function findById(string $table, mixed $id, string $name = 'id') : bool|array; public function findById(string $table, mixed $id, string $name = 'id') : ?array;
/** /**
* Метод экранирования данных с учетом текущего подключения в т.ч для LIKE * Метод экранирования данных с учетом текущего подключения в т.ч для LIKE

View File

@@ -10,7 +10,8 @@ use Rmphp\Storage\Attribute\Property;
use Rmphp\Storage\Attribute\PropertyNoReturn; use Rmphp\Storage\Attribute\PropertyNoReturn;
use Rmphp\Storage\Attribute\PropertyNoReturnIfNull; use Rmphp\Storage\Attribute\PropertyNoReturnIfNull;
use Rmphp\Storage\Attribute\ValueObject; use Rmphp\Storage\Attribute\ValueObject;
use Rmphp\Storage\Attribute\ValueObjectAutoPropertyName; use Rmphp\Storage\Attribute\ValueObjectFirstProperty;
use Rmphp\Storage\Attribute\ValueObjectPropertyName;
use Rmphp\Storage\Component\AbstractDataObject; use Rmphp\Storage\Component\AbstractDataObject;
use Rmphp\Storage\Exception\RepositoryException; use Rmphp\Storage\Exception\RepositoryException;
@@ -60,16 +61,22 @@ abstract class AbstractRepository extends AbstractDataObject implements Reposito
self::$attributeObjects[$valueObjectClass] = !empty(self::$classes[$valueObjectClass]->getAttributes(ValueObject::class)) self::$attributeObjects[$valueObjectClass] = !empty(self::$classes[$valueObjectClass]->getAttributes(ValueObject::class))
? self::$classes[$valueObjectClass]->getAttributes(ValueObject::class)[0]->newInstance() ? self::$classes[$valueObjectClass]->getAttributes(ValueObject::class)[0]->newInstance()
: new ValueObject(); : new ValueObject();
if(!empty(self::$classes[$valueObjectClass]->getAttributes(ValueObjectFirstProperty::class))) {
self::$attributeObjects[$valueObjectClass]->firstProperty = true;
}
if(!empty(self::$classes[$valueObjectClass]->getAttributes(ValueObjectPropertyName::class))) {
$propertyName = self::$classes[$valueObjectClass]->getAttributes(ValueObjectPropertyName::class)[0]->newInstance();
if(isset($propertyName->name)) self::$attributeObjects[$valueObjectClass]->propertyName = $propertyName->name;
}
} }
$valueObjectAttributes = self::$attributeObjects[$valueObjectClass]; $valueObjectAttributes = self::$attributeObjects[$valueObjectClass];
if(!empty(self::$classes[$valueObjectClass]->getAttributes(ValueObjectAutoPropertyName::class))) $valueObjectAttributes->autoPropertyName = true;
if(!empty($valueObjectAttributes->propertyName) && self::$classes[$valueObjectClass]->hasProperty($valueObjectAttributes->propertyName)){ if(!empty($valueObjectAttributes->propertyName) && self::$classes[$valueObjectClass]->hasProperty($valueObjectAttributes->propertyName)){
if(self::$classes[$valueObjectClass]->getProperty($valueObjectAttributes->propertyName)->isInitialized($property->getValue($object))){ if(self::$classes[$valueObjectClass]->getProperty($valueObjectAttributes->propertyName)->isInitialized($property->getValue($object))){
$fieldValue[$property->getName()] = self::$classes[$valueObjectClass]->getProperty($valueObjectAttributes->propertyName)->getValue($property->getValue($object)); $fieldValue[$property->getName()] = self::$classes[$valueObjectClass]->getProperty($valueObjectAttributes->propertyName)->getValue($property->getValue($object));
} }
} }
elseif(!empty($valueObjectAttributes->autoPropertyName) && count(self::$classes[$valueObjectClass]->getProperties()) === 1){ elseif(!empty($valueObjectAttributes->firstProperty) && count(self::$classes[$valueObjectClass]->getProperties()) > 0){
if(self::$classes[$valueObjectClass]->getProperties()[0]->isInitialized($property->getValue($object))){ if(self::$classes[$valueObjectClass]->getProperties()[0]->isInitialized($property->getValue($object))){
$fieldValue[$property->getName()] = self::$classes[$valueObjectClass]->getProperties()[0]->getValue($property->getValue($object)); $fieldValue[$property->getName()] = self::$classes[$valueObjectClass]->getProperties()[0]->getValue($property->getValue($object));
} }
@@ -77,11 +84,6 @@ abstract class AbstractRepository extends AbstractDataObject implements Reposito
elseif(self::$classes[$valueObjectClass]->hasMethod('getValue')){ elseif(self::$classes[$valueObjectClass]->hasMethod('getValue')){
$fieldValue[$property->getName()] = $property->getValue($object)->getValue(); $fieldValue[$property->getName()] = $property->getValue($object)->getValue();
} }
elseif(count(self::$classes[$valueObjectClass]->getProperties()) === 1){
if(self::$classes[$valueObjectClass]->getProperties()[0]->isInitialized($property->getValue($object))){
$fieldValue[$property->getName()] = self::$classes[$valueObjectClass]->getProperties()[0]->getValue($property->getValue($object));
}
}
} }
elseif(is_bool($property->getValue($object))){ elseif(is_bool($property->getValue($object))){
$fieldValue[$property->getName()] = (int)$property->getValue($object); $fieldValue[$property->getName()] = (int)$property->getValue($object);