Laravel 8 预加载

2021-07-19 11:40 更新

当以属性方式访问 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, ...) 
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号