]> git.mxchange.org Git - friendica.git/commitdiff
Improve Base collection, model and repository
authorHypolite Petovan <hypolite@mrpetovan.com>
Tue, 14 Jan 2020 03:18:45 +0000 (22:18 -0500)
committerHypolite Petovan <hypolite@mrpetovan.com>
Mon, 20 Jan 2020 12:32:49 +0000 (07:32 -0500)
- Add collection pipeline methods
- Add save collection method

src/BaseCollection.php
src/BaseModel.php
src/BaseRepository.php

index 8bad3b8d28abf5863474bb9086446ac3cc43711d..4d5803d58524e1b8dccfdba00a9b056c2fccef8a 100644 (file)
@@ -28,6 +28,30 @@ abstract class BaseCollection extends \ArrayIterator
                $this->totalCount = $totalCount ?? count($models);
        }
 
+       /**
+        * @inheritDoc
+        */
+       public function offsetSet($offset, $value)
+       {
+               if (is_null($offset)) {
+                       $this->totalCount++;
+               }
+
+               parent::offsetSet($offset, $value);
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function offsetUnset($offset)
+       {
+               if ($this->offsetExists($offset)) {
+                       $this->totalCount--;
+               }
+
+               parent::offsetUnset($offset);
+       }
+
        /**
         * @return int
         */
@@ -35,4 +59,42 @@ abstract class BaseCollection extends \ArrayIterator
        {
                return $this->totalCount;
        }
+
+       /**
+        * Return the values from a single field in the collection
+        *
+        * @param string   $column
+        * @param int|null $index_key
+        * @return array
+        * @see array_column()
+        */
+       public function column($column, $index_key = null)
+       {
+               return array_column($this->getArrayCopy(), $column, $index_key);
+       }
+
+       /**
+        * Apply a callback function on all elements in the collection and returns a new collection with the updated elements
+        *
+        * @param callable $callback
+        * @return BaseCollection
+        * @see array_map()
+        */
+       public function map(callable $callback)
+       {
+               return new static(array_map($callback, $this->getArrayCopy()), $this->getTotalCount());
+       }
+
+       /**
+        * Filters the collection based on a callback that returns a boolean whether the current item should be kept.
+        *
+        * @param callable|null $callback
+        * @param int           $flag
+        * @return BaseCollection
+        * @see array_filter()
+        */
+       public function filter(callable $callback = null, int $flag = 0)
+       {
+               return new static(array_filter($this->getArrayCopy(), $callback, $flag));
+       }
 }
index 5a27089143d8ab48ff52cf3f4be5b43799a91ae1..b2dc7eedaf50ad58b88da114134f2d4671b79852 100644 (file)
@@ -69,6 +69,18 @@ abstract class BaseModel
                return $model;
        }
 
+       /**
+        * Magic isset method. Returns true if the field exists, either in the data prperty array or in any of the local properties.
+        * Used by array_column() on an array of objects.
+        *
+        * @param $name
+        * @return bool
+        */
+       public function __isset($name)
+       {
+               return in_array($name, array_merge(array_keys($this->data), array_keys(get_object_vars($this))));
+       }
+
        /**
         * Magic getter. This allows to retrieve model fields with the following syntax:
         * - $model->field (outside of class)
@@ -80,9 +92,7 @@ abstract class BaseModel
         */
        public function __get($name)
        {
-               if (empty($this->data['id'])) {
-                       throw new HTTPException\InternalServerErrorException(static::class . ' record uninitialized');
-               }
+               $this->checkValid();
 
                if (!array_key_exists($name, $this->data)) {
                        throw new HTTPException\InternalServerErrorException('Field ' . $name . ' not found in ' . static::class);
@@ -104,4 +114,11 @@ abstract class BaseModel
        {
                return $this->data;
        }
+
+       protected function checkValid()
+       {
+               if (empty($this->data['id'])) {
+                       throw new HTTPException\InternalServerErrorException(static::class . ' record uninitialized');
+               }
+       }
 }
index 30822091e1784f8e63842c47a465ea753a7686b8..c0bcab18f92fbafc37a8e96b23561eecb1899c66 100644 (file)
@@ -199,4 +199,12 @@ abstract class BaseRepository extends BaseFactory
 
                return $models;
        }
+
+       /**
+        * @param BaseCollection $collection
+        */
+       public function saveCollection(BaseCollection $collection)
+       {
+               $collection->map([$this, 'update']);
+       }
 }