<?php
namespace Illuminate\Database\Eloquent;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection as BaseCollection;
class Collection extends BaseCollection
{
* 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 ($itemKey, $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 ($k, $m) use ($key) {
return $m->getKey() == $key;
});
}
* Fetch a nested element of the collection.
*
* @param string $key
* @return static
*
* @deprecated since version 5.1. Use pluck instead.
*/
public function fetch($key)
{
return new static(Arr::fetch($this->toArray(), $key));
}
* Get the array of primary keys.
*
* @return array
*/
public function modelKeys()
{
return array_map(function ($m) {
return $m->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));
}
* 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
* @return static
*/
public function unique($key = null)
{
if (! is_null($key)) {
return parent::unique($key);
}
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)
{
$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 hidden, attributes visible across the entire collection.
*
* @param array|string $attributes
* @return $this
*/
public function withHidden($attributes)
{
$this->each(function ($model) use ($attributes) {
$model->withHidden($attributes);
});
return $this;
}
* Get a dictionary keyed by primary keys.
*
* @param \ArrayAccess|array $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;
}
* Get a base Support collection instance from this collection.
*
* @return \Illuminate\Support\Collection
*/
public function toBase()
{
return new BaseCollection($this->items);
}
}