/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php
https://gitlab.com/milton2913/myBlog · PHP · 364 lines · 172 code · 53 blank · 139 comment · 14 complexity · ae1c093954f9db2040834d220eacd332 MD5 · raw file
- <?php
- namespace Illuminate\Database\Eloquent;
- use LogicException;
- use Illuminate\Support\Arr;
- use Illuminate\Contracts\Queue\QueueableCollection;
- use Illuminate\Support\Collection as BaseCollection;
- class Collection extends BaseCollection implements QueueableCollection
- {
- /**
- * Find a model in the collection by key.
- *
- * @param mixed $key
- * @param mixed $default
- * @return \Illuminate\Database\Eloquent\Model
- */
- public function find($key, $default = null)
- {
- if ($key instanceof Model) {
- $key = $key->getKey();
- }
- return Arr::first($this->items, function ($model) use ($key) {
- return $model->getKey() == $key;
- }, $default);
- }
- /**
- * Load a set of relationships onto the collection.
- *
- * @param mixed $relations
- * @return $this
- */
- public function load($relations)
- {
- if (count($this->items) > 0) {
- if (is_string($relations)) {
- $relations = func_get_args();
- }
- $query = $this->first()->newQuery()->with($relations);
- $this->items = $query->eagerLoadRelations($this->items);
- }
- return $this;
- }
- /**
- * Add an item to the collection.
- *
- * @param mixed $item
- * @return $this
- */
- public function add($item)
- {
- $this->items[] = $item;
- return $this;
- }
- /**
- * Determine if a key exists in the collection.
- *
- * @param mixed $key
- * @param mixed $value
- * @return bool
- */
- public function contains($key, $value = null)
- {
- if (func_num_args() == 2) {
- return parent::contains($key, $value);
- }
- if ($this->useAsCallable($key)) {
- return parent::contains($key);
- }
- $key = $key instanceof Model ? $key->getKey() : $key;
- return parent::contains(function ($model) use ($key) {
- return $model->getKey() == $key;
- });
- }
- /**
- * Get the array of primary keys.
- *
- * @return array
- */
- public function modelKeys()
- {
- return array_map(function ($model) {
- return $model->getKey();
- }, $this->items);
- }
- /**
- * Merge the collection with the given items.
- *
- * @param \ArrayAccess|array $items
- * @return static
- */
- public function merge($items)
- {
- $dictionary = $this->getDictionary();
- foreach ($items as $item) {
- $dictionary[$item->getKey()] = $item;
- }
- return new static(array_values($dictionary));
- }
- /**
- * Run a map over each of the items.
- *
- * @param callable $callback
- * @return \Illuminate\Support\Collection
- */
- public function map(callable $callback)
- {
- $result = parent::map($callback);
- return $result->contains(function ($item) {
- return ! $item instanceof Model;
- }) ? $result->toBase() : $result;
- }
- /**
- * Diff the collection with the given items.
- *
- * @param \ArrayAccess|array $items
- * @return static
- */
- public function diff($items)
- {
- $diff = new static;
- $dictionary = $this->getDictionary($items);
- foreach ($this->items as $item) {
- if (! isset($dictionary[$item->getKey()])) {
- $diff->add($item);
- }
- }
- return $diff;
- }
- /**
- * Intersect the collection with the given items.
- *
- * @param \ArrayAccess|array $items
- * @return static
- */
- public function intersect($items)
- {
- $intersect = new static;
- $dictionary = $this->getDictionary($items);
- foreach ($this->items as $item) {
- if (isset($dictionary[$item->getKey()])) {
- $intersect->add($item);
- }
- }
- return $intersect;
- }
- /**
- * Return only unique items from the collection.
- *
- * @param string|callable|null $key
- * @param bool $strict
- * @return static|\Illuminate\Support\Collection
- */
- public function unique($key = null, $strict = false)
- {
- if (! is_null($key)) {
- return parent::unique($key, $strict);
- }
- return new static(array_values($this->getDictionary()));
- }
- /**
- * Returns only the models from the collection with the specified keys.
- *
- * @param mixed $keys
- * @return static
- */
- public function only($keys)
- {
- if (is_null($keys)) {
- return new static($this->items);
- }
- $dictionary = Arr::only($this->getDictionary(), $keys);
- return new static(array_values($dictionary));
- }
- /**
- * Returns all models in the collection except the models with specified keys.
- *
- * @param mixed $keys
- * @return static
- */
- public function except($keys)
- {
- $dictionary = Arr::except($this->getDictionary(), $keys);
- return new static(array_values($dictionary));
- }
- /**
- * Make the given, typically visible, attributes hidden across the entire collection.
- *
- * @param array|string $attributes
- * @return $this
- */
- public function makeHidden($attributes)
- {
- return $this->each(function ($model) use ($attributes) {
- $model->addHidden($attributes);
- });
- }
- /**
- * Make the given, typically hidden, attributes visible across the entire collection.
- *
- * @param array|string $attributes
- * @return $this
- */
- public function makeVisible($attributes)
- {
- return $this->each(function ($model) use ($attributes) {
- $model->makeVisible($attributes);
- });
- }
- /**
- * Get a dictionary keyed by primary keys.
- *
- * @param \ArrayAccess|array|null $items
- * @return array
- */
- public function getDictionary($items = null)
- {
- $items = is_null($items) ? $this->items : $items;
- $dictionary = [];
- foreach ($items as $value) {
- $dictionary[$value->getKey()] = $value;
- }
- return $dictionary;
- }
- /**
- * The following methods are intercepted to always return base collections.
- */
- /**
- * Get an array with the values of a given key.
- *
- * @param string $value
- * @param string|null $key
- * @return \Illuminate\Support\Collection
- */
- public function pluck($value, $key = null)
- {
- return $this->toBase()->pluck($value, $key);
- }
- /**
- * Get the keys of the collection items.
- *
- * @return \Illuminate\Support\Collection
- */
- public function keys()
- {
- return $this->toBase()->keys();
- }
- /**
- * Zip the collection together with one or more arrays.
- *
- * @param mixed ...$items
- * @return \Illuminate\Support\Collection
- */
- public function zip($items)
- {
- return call_user_func_array([$this->toBase(), 'zip'], func_get_args());
- }
- /**
- * Collapse the collection of items into a single array.
- *
- * @return \Illuminate\Support\Collection
- */
- public function collapse()
- {
- return $this->toBase()->collapse();
- }
- /**
- * Get a flattened array of the items in the collection.
- *
- * @param int $depth
- * @return \Illuminate\Support\Collection
- */
- public function flatten($depth = INF)
- {
- return $this->toBase()->flatten($depth);
- }
- /**
- * Flip the items in the collection.
- *
- * @return \Illuminate\Support\Collection
- */
- public function flip()
- {
- return $this->toBase()->flip();
- }
- /**
- * Get the type of the entities being queued.
- *
- * @return string|null
- */
- public function getQueueableClass()
- {
- if ($this->count() === 0) {
- return;
- }
- $class = get_class($this->first());
- $this->each(function ($model) use ($class) {
- if (get_class($model) !== $class) {
- throw new LogicException('Queueing collections with multiple model types is not supported.');
- }
- });
- return $class;
- }
- /**
- * Get the identifiers for all of the entities.
- *
- * @return array
- */
- public function getQueueableIds()
- {
- return $this->modelKeys();
- }
- }