- Added callable field in search, searchOne, remove, removeOne, etc...
This commit is contained in:
parent
a5d65025f8
commit
2f482324b2
@ -100,7 +100,7 @@ class EntityCollection extends \ArrayObject implements \JsonSerializable {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function removeOne($value, string $field, bool $strict = true) : ? object
|
||||
public function removeOne($value, callable|string $field, bool $strict = true) : ? object
|
||||
{
|
||||
foreach($this->search($value, $field, $strict) as $key => $item) {
|
||||
$this->offsetUnset($key);
|
||||
@ -111,7 +111,7 @@ class EntityCollection extends \ArrayObject implements \JsonSerializable {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function remove(/* mixed */ $value, string $field, bool $strict = true) : array
|
||||
public function remove(/* mixed */ $value, callable|string $field, bool $strict = true) : array
|
||||
{
|
||||
$removed = [];
|
||||
|
||||
@ -131,14 +131,21 @@ class EntityCollection extends \ArrayObject implements \JsonSerializable {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function search(mixed $value, string $field, bool $strict = true) : Generator
|
||||
public function search(mixed $value, callable|string $field, bool $strict = true) : Generator
|
||||
{
|
||||
foreach($this->filters(fn($v) => isset($v->$field) ? ( $strict ? $v->$field === $value : $v->$field == $value ) : false) as $key => $item) {
|
||||
if (is_string($field)) {
|
||||
$filtering = fn($v) => isset($v->$field) ? ($strict ? $v->$field === $value : $v->$field == $value) : false;
|
||||
}
|
||||
elseif (is_callable($field)) {
|
||||
$filtering = fn($v) => ( $fieldValue = call_user_func($field, $v) ) !== null ? ($strict ? $fieldValue === $value : $fieldValue == $value) : false;
|
||||
}
|
||||
|
||||
foreach($this->filters($filtering) as $key => $item) {
|
||||
yield $key => $item;
|
||||
}
|
||||
}
|
||||
|
||||
public function searchOne(mixed $value, string $field, bool $strict = true) : ? object
|
||||
public function searchOne(mixed $value, callable|string $field, bool $strict = true) : ? object
|
||||
{
|
||||
# Returning first value only
|
||||
foreach($this->search($value, $field, $strict) as $item) {
|
||||
@ -148,7 +155,7 @@ class EntityCollection extends \ArrayObject implements \JsonSerializable {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function searchAll(mixed $values, string $field, bool $strict = true, bool $compareArray = false) : self
|
||||
public function searchAll(mixed $values, callable|string $field, bool $strict = true, bool $compareArray = false) : self
|
||||
{
|
||||
$collection = new static();
|
||||
|
||||
@ -163,7 +170,7 @@ class EntityCollection extends \ArrayObject implements \JsonSerializable {
|
||||
return $collection;
|
||||
}
|
||||
|
||||
public function diffAll(mixed $values, string $field, bool $strict = true, bool $compareArray = false) : self
|
||||
public function diffAll(mixed $values, callable|string $field, bool $strict = true, bool $compareArray = false) : self
|
||||
{
|
||||
$obj = new static($this->getArrayCopy());
|
||||
|
||||
|
@ -25,7 +25,91 @@ trait SearchRequestFromRequestTrait
|
||||
|
||||
protected array $orders = [];
|
||||
|
||||
public function fromRequest(ServerRequestInterface $request)
|
||||
public function fromArray(array|\ArrayAccess $data) : static
|
||||
{
|
||||
$this->page = $data['page'] ?? 1;
|
||||
|
||||
$classReflection = ObjectReflection::fromClass(static::class)->reflectClass();
|
||||
|
||||
foreach($classReflection->getProperties() as $propertyName => $property) {
|
||||
$attributeList = $property->getAttributes(Attribute\SearchParameter::class);
|
||||
|
||||
if ($attributeList) {
|
||||
$attribute = $attributeList[0]->object;
|
||||
|
||||
$fieldName = $attribute->field ?? $propertyName;
|
||||
|
||||
# Field could be defined for another entity class
|
||||
if (is_array($fieldName)) {
|
||||
$field = \Ulmus\Attribute\Attribute::handleArrayField($fieldName, false);
|
||||
}
|
||||
# Default class using it, if SearchRequestParameter is defined
|
||||
elseif ($classAttributes = $classReflection->getAttributes(SearchRequestParameter::class)) {
|
||||
$searchRequestAttribute = $classAttributes[0]->object;
|
||||
$className = $searchRequestAttribute->class;
|
||||
$field = $className::field($fieldName, $searchRequestAttribute->alias);
|
||||
}
|
||||
# Untouched string from the attribute
|
||||
else {
|
||||
$field = $fieldName;
|
||||
}
|
||||
|
||||
$value = $data[$propertyName] ?? null;
|
||||
|
||||
if ($value !== null) {
|
||||
$value = $this->transformValue($property->getAttributes(Attribute\PropertyValueModifier::class), $value);
|
||||
}
|
||||
|
||||
switch(true) {
|
||||
case $attribute instanceof SearchGroupBy:
|
||||
$this->parseAttributeGroupBy($attribute, $field, $propertyName);
|
||||
break;
|
||||
|
||||
case $attribute instanceof SearchWhere:
|
||||
case $attribute instanceof SearchLike:
|
||||
case $attribute instanceof SearchManual:
|
||||
if ($attribute->toggle) {
|
||||
$this->$propertyName = ! empty($value);
|
||||
}
|
||||
elseif ($value !== null) {
|
||||
foreach ($property->getTypes() as $type) {
|
||||
$enum = $type->type;
|
||||
|
||||
if (enum_exists($enum)) {
|
||||
try {
|
||||
$this->$propertyName = $value instanceof \UnitEnum ? $value : $type->type::from($value);
|
||||
} catch (\ValueError $ex) {
|
||||
$cases = implode(', ', array_map(fn($e) => $e->name, $enum::cases()));
|
||||
|
||||
throw new \ValueError(
|
||||
sprintf("Given value '%s' do not exists within enum '%s'. Try one of those values instead : %s", $value, $enum, $cases)
|
||||
);
|
||||
}
|
||||
}
|
||||
elseif ($type->builtIn || $value instanceof \Stringable ) {
|
||||
$this->$propertyName = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->parseAttributeMethod($attribute, $field, $propertyName);
|
||||
break;
|
||||
|
||||
case $attribute instanceof SearchOrderBy:
|
||||
if ($value !== null) {
|
||||
$this->$propertyName = $value;
|
||||
}
|
||||
|
||||
$this->parseAttributeOrderBy($attribute, $field, $propertyName);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function fromRequest(ServerRequestInterface $request) : static
|
||||
{
|
||||
if (method_exists($this, 'prepare')) {
|
||||
$this->prepare($request);
|
||||
|
Loading…
x
Reference in New Issue
Block a user