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 },
],
}
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);
}
So we can use this method like User::findMany([1, 2, 3])
.
I personally prefer this way because it is more explicit.
Top comments (2)
Excellent Post!
Thank you!