Deep Dive into get() method in Laravel Collection

3 months ago

If you use Laravel, I am sure that you already used get() method from the collection. Today, I will try to deep dive into get() method in Laravel collection.

Uses

$data = [
    "foo_key" => "foo value",
    "bar_key" => "bar value",
    "baz_key" => "baz value",
];

$getFoo = collect($data)->get("foo_key");

dd($getFoo);
// foo value

How get() method works?

Illuminate\Support\Collection

/**
 * Get an item from the collection by key.
 *
 * @param  mixed  $key
 * @param  mixed  $default
 * @return mixed
 */
public function get($key, $default = null)
{
    if (array_key_exists($key, $this->items)) {
        return $this->items[$key];
    }

    return value($default);
}

Investigate:

  • It requires a $key.
  • It checks the $key in the given array date in collect() method.
  • If $key found in the array, then it returns the value

:question: What if the given $key doesn't have any associated value? What should it returns?

Then it will return the default value that is null.

public function get($key, $default = null)
.
.

You can also change the default value. For example-

$data = [];

$getFoo = collect($data)->get("foo", 'Nothing found');

dd($getFoo);    // Nothing found

If given $key doesn't match in the array, then it called another global functions named value()

/**
 * Return the default value of the given value.
 *
 * @param  mixed  $value
 * @return mixed
 */
function value($value, ...$args)
{
    return $value instanceof Closure ? $value(...$args) : $value;
}

Investigate:

It check if no Closure pass, then just return the given value.

Can we send the closure also?

Yes, you can do that also. You can manipulate the entire response.

For example-

$data = [];

$getFoo = collect($data)->get("foo", function () {
    return "Response from closure";
});

dd($getFoo);    //Response from closure