diff --git a/src/EntityCollection.php b/src/EntityCollection.php index 5f94cfe..e66440f 100644 --- a/src/EntityCollection.php +++ b/src/EntityCollection.php @@ -5,17 +5,17 @@ namespace Ulmus; use Generator; class EntityCollection extends \ArrayObject { - + public ? string $entityClass = null; - + public function filters(Callable $callback, bool $yieldValueOnly = false) : Generator { $idx = 0; - + foreach($this as $key => $item) { if ( $callback($item, $key, $idx) ) { $idx++; - + if ( $yieldValueOnly ) { yield $item; } @@ -25,91 +25,91 @@ class EntityCollection extends \ArrayObject { } } } - + public function filtersCollection(Callable $callback, bool $yieldValueOnly = false, bool $replaceCollection = false) : self { $collection = new static(); - + foreach($this->filters($callback, $yieldValueOnly) as $item) { $collection->append($item); } - + if ($replaceCollection) { $this->exchangeArray(array_values($collection->getArrayCopy())); - + return $this; } else { return $collection; } } - + public function iterate(Callable $callback) : self { foreach($this as $item) { $callback($item); } - + return $this; } - + public function removeOne($value, string $field, bool $strict = true) : ? object { foreach($this->search($value, $field, $strict) as $key => $item) { - + $this->offsetUnset($key); - + return $item; } - + return null; } - + public function remove($value, string $field, bool $strict = true) : array { $removed = []; - + foreach($this->search($value, $field, $strict) as $key => $item) { $this->offsetUnset($key); - + $removed[] = $item; } - + return $removed; } - - public function search($value, string $field, bool $strict = true) : Generator + + public function search($value, string $field, bool $strict = true) : Generator { foreach($this->filters(fn($v) => $strict ? $v->$field === $value : $v->$field == $value) as $key => $item) { yield $key => $item; } } - - public function searchOne($value, string $field, bool $strict = true) : ? object + + public function searchOne($value, string $field, bool $strict = true) : ? object { # Returning first value only foreach($this->search($value, $field, $strict) as $item) { return $item; } - + return null; } - + public function searchAll($value, string $field, bool $strict = true) : self { $obj = new static(); - + foreach($this->search($value, $field, $strict) as $item) { $obj->append($item); } - + return $obj; } - + public function column($field, bool $unique = false) : array { $list = []; - + foreach($this as $item) { if ( is_callable($field) ) { $value = call_user_func_array($field, [ $item ]); @@ -117,22 +117,22 @@ class EntityCollection extends \ArrayObject { else { $value = $item->$field; } - + if ($unique && in_array($value, $list)) { break; } - + $list[] = $value; } - + return $list; } - + public function unique(/*stringable|callable */ $field, bool $strict = false) : self { $list = []; $obj = new static(); - + foreach($this as $item) { if ( $field === null) { $value = $this; @@ -143,23 +143,23 @@ class EntityCollection extends \ArrayObject { else { $value = $item->$field; } - + if ( ! in_array($value, $list, $strict) ) { $list[] = $value; - + $obj->append($item); - } + } } - + return $obj; } - + public function first() : ? object { foreach($this as $item) { return $item; } - + return null; } @@ -168,103 +168,119 @@ class EntityCollection extends \ArrayObject { foreach($this as $item) { $return = $item; } - + return $return ?? null; } - + public function buildArray(string $keyColumn, /* string|callable|null */ $value = null) : array { $list = []; - + foreach($this as $item) { switch (true) { case is_null($value): $list[] = $item->$keyColumn; - break; - + break; + case is_callable($value): $list[$item->$keyColumn] = $value($item); - break; - + break; + case is_object($value): case is_string($value): $value = (string) $value; - + $list[$item->$keyColumn] = $item->$value; - break; + break; } } - + return $list; } - - public function implode(string $glue, ? Callable $callback = null) : string + + public function implode(string $glue, ? Callable $callback = null) : string { $values = []; - + foreach($this as $item) { $values[] = $callback ? $callback($item) : (string) $item; } - + return implode($glue, $values); } - + public function toArray(bool $includeRelations = false) : array { $list = []; - + foreach($this as $entity) { $list[] = $entity->toArray($includeRelations); } - + return $list; } - - public function fromArray(array $datasets, ? string /*stringable*/ $entityClass = null) : self + + public function fromArray(array $datasets, ? string /*stringable*/ $entityClass = null) : self + { + + foreach($datasets as $dataset) { + $this->append( $this->arrayToEntity($dataset, $entityClass) ); + } + + return $this; + } + + public function arrayToEntity(array $dataset, ? string /*stringable*/ $entityClass = null) : object { if ( ! ($this->entityClass || $entityClass) ) { throw new \Exception("An entity class name must be provided to be instanciated and populated before insertion into this collection."); } - - $className = $entityClass ?: $this->entityClass; - - foreach($datasets as $dataset) { - $this->append( (new $className() )->fromArray($dataset) ); - } - - return $this; + + $className = $this->entityClass; + + return ( new $className() )->fromArray($dataset); } - + + public function append($value) : void + { + if ( is_array($value) ) { + $this->append( $this->arrayToEntity($value) ); + } + else { + parent::append($value); + } + } + public function mergeWith( /*array|EntityCollection*/ $datasets ) : self { if ( is_object($datasets) ) { $datasets = $datasets->getArrayCopy(); } - + $this->exchangeArray( array_merge( $this->getArrayCopy(), $datasets ) ); - + return $this; } - + public function replaceWith( /*array|EntityCollection*/ $datasets ) : self { if ( is_object($datasets) ) { $datasets = $datasets->getArrayCopy(); } - + $this->exchangeArray( $datasets ); - + return $this; } - + public function randomize() : self { $arr = $this->getArrayCopy(); shuffle($arr); $this->exchangeArray($arr); - + return $this; } - + public function sort(callable $callback, $function = "uasort") : self { call_user_func_array([ $this, $function ], [ $callback ]); diff --git a/src/QueryBuilder.php b/src/QueryBuilder.php index 5ce92a9..a19aa19 100644 --- a/src/QueryBuilder.php +++ b/src/QueryBuilder.php @@ -64,11 +64,11 @@ class QueryBuilder { if ( null === $this->getFragment(Query\Insert::class) ) { if ( $schema ) { - $table = "\"$schema\".$table"; + $table = "$schema.$table"; } if ( $database ) { - $table = "\"$database\".$table"; + $table = "$database.$table"; } $insert = new Query\Insert(); @@ -327,11 +327,11 @@ class QueryBuilder { if ( null === $this->getFragment(Query\Create::class) ) { if ( $schema ) { - $table = "\"$schema\".$table"; + $table = "$schema.$table"; } if ( $database ) { - $table = "\"$database\".$table"; + $table = "$database.$table"; } $create = new Query\Create();