阅读(420)
赞(10)
Laravel 8 预加载
2021-07-08 09:44:46 更新
当以属性方式访问 Eloquent 关联时,关联数据「懒加载」。这意味着直到第一次访问属性时关联数据才会被真实加载。不过 Eloquent 能在查询父模型时「预先载入」子关联。预加载可以缓解 N + 1 查询问题。为了说明 N + 1 查询问题,考虑 Book
模型关联到 Author
的情形:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Book extends Model
{
/**
* 获取书籍作者
*/
public function author()
{
return $this->belongsTo('App\Models\Author');
}
}
现在,我们来获取所有的书籍及其作者:
$books = App\Models\Book::all();
foreach ($books as $book) {
echo $book->author->name;
}
此循环将执行一个查询,用于获取全部书籍,然后为每本书执行获取作者的查询。如果我们有 25 本书,此循环将运行 26 个查询:1 个用于查询书籍,25 个附加查询用于查询每本书的作者。
谢天谢地,我们能够使用预加载将操作压缩到只有 2 个查询。在查询时,可以使用 with
方法指定想要预加载的关联:
$books = App\Models\Book::with('author')->get();
foreach ($books as $book) {
echo $book->author->name;
}
在这个例子中,仅执行了两个查询:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)