继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

限制在 Laravel 模型中预加载的关系

凤凰求蛊
关注TA
已关注
手记 188
粉丝 9
获赞 15

三以下是翻译内容:
介绍

有时在[Laravel模型中进行 eager 加载]时,你可能希望限制返回的关联模型的数量。

例如,在一个博客平台上,你可能想查看系统中的每位作者以及他们各自的三篇帖子。

在旧版本的 Laravel 中,限制预加载的关系是一件有点棘手的任务。我从未真正找到一种让我觉得满意的方式来完成它。因此,我通常会安装 Jonas Staudenmeir 的(@staudenmeirstaudenmeir/eloquent-eager-limit 包,它提供了这种功能。

不过,今年初,这个功能的核心部分已经合并到了Laravel框架中。这意味着在Laravel 11,我们可以在不安装额外包的情况下限制预加载的关联。

我们来看个例子吧。

在 Laravel 中限制 eager 加载的关联

假设我们有一个博客平台,并且我们要加载系统中的每个作者以及他们各自的三篇文章。

我们可以使用急切加载查询中的 limit 方法来实现这一点。

    use App\Models\Post;  
    use App\Models\Author;  
    use Illuminate\Contracts\Database\Eloquent\Builder;  

    $authors = Author::query()  
        ->with([  
            'posts' => fn (Builder $query): Builder => $query->limit(3),  
        ])  
        ->get();

如上所示的代码示例,我们希望在 App\Models\Author 模型的 posts 关联上进行预加载的查询。在预加载的查询中,我们使用了 limit 方法,仅加载三个帖子。

底层的 SQL 查询

有兴趣的人会发现,上述查询会产生两个SQL查询。

第一个查询就是从数据库里查作者的。

    SELECT * FROM `authors` 从 `authors` 表中选择所有数据。

假设系统里有五个作者,第二个查询会检索每个作者的前三条帖子。

    SELECT *  
    FROM  
        (  
            SELECT  
                *,  
                row_number() OVER (PARTITION BY `posts`.`author_id`) AS `laravel_row`  
            FROM `posts`  
            WHERE `posts`.`author_id` IN (1, 2, 3, 4, 5)  
        ) AS `laravel_table`  
    WHERE `laravel_row` <= 3  
    ORDER BY `laravel_row`
更多阅读

如果你觉得这篇帖子不错,你可能会对我的这本 220 多页的电子书《Battle Ready Laravel》感兴趣,这本书更深入地探讨了类似的话题。你可以在这里购买。

或者,你可以查看我的另一本440多页的电子书《Laravel 中的 API 消费》,这本书教你如何使用 Laravel 从其他服务消费 API。

如果你想每次我发新文章时都能收到更新,订阅我的邮件列表。订阅我的邮件列表

继续做 awesome 的东西,加油!🚀

_ was originally published at 该在 https://ashallendesign.co.uk _.

(Note: The first character "" is replicated as in the source text, which seems unusual. For a more standard translation, it should be "最初" instead of " was".)

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP