codecamp

Laravel 8 预加载

当以属性方式访问 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, ...) 
Laravel 8 多态关联计数
Laravel 8 预加载多个关联
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Laravel 8 入门指南

Laravel 8 基础功能

Laravel 8 前端开发

Laravel 8 安全相关

Laravel 8 综合话题

数据库

Eloquent ORM

测试相关

官方拓展包

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }