DEV Community

loading...

Laravel tips: Model::findMany is useful

acro5piano profile image Kay Gosho Updated on ・1 min read

When you want to get multiple results of find with array of ID, you can pass the array to Model::find.

This feature started to be documented since Larave 5.2, but I found that we can use it even in Laravel 5.1.
I read Laravel source code (with no objective) then found it.

>>> App\User::find([1,2,3])

=> Illuminate\Database\Eloquent\Collection {#1090
     all: [
       App\User { id: 1 },
       App\User { id: 2 },
       App\User { id: 3 },
     ],
   }
Enter fullscreen mode Exit fullscreen mode

I used to write like User::whereIn([1, 2, 3])->get() before I found this technic.

We can also use findMany method. Actually find method runs findMany if the first argument is array.

in laravel/framework/src/Illuminate/Database/Eloquent/Builder.php

public function find($id, $columns = ['*'])
{
    if (is_array($id) || $id instanceof Arrayable) {
        return $this->findMany($id, $columns);
    }
    return $this->whereKey($id)->first($columns);
}

public function findMany($ids, $columns = ['*'])
{
    if (empty($ids)) {
        return $this->model->newCollection();
    }

    $this->query->whereIn($this->model->getQualifiedKeyName(), $ids);

    return $this->get($columns);
}
Enter fullscreen mode Exit fullscreen mode

https://github.com/laravel/framework/blob/ba0fa733243fd9b5abac67e40c9a1f7ba2ca0391/src/Illuminate/Database/Eloquent/Builder.php#L287

So we can use this method like User::findMany([1, 2, 3]).
I personally prefer this way because it is more explicit.

Discussion (2)

pic
Editor guide
Collapse
jonathanjd profile image
Jonathan Duran

Excellent Post!

Collapse
acro5piano profile image