有时在[Laravel模型中进行 eager 加载]时,你可能希望限制返回的关联模型的数量。
例如,在一个博客平台上,你可能想查看系统中的每位作者以及他们各自的三篇帖子。
在旧版本的 Laravel 中,限制预加载的关系是一件有点棘手的任务。我从未真正找到一种让我觉得满意的方式来完成它。因此,我通常会安装 Jonas Staudenmeir 的(@staudenmeir)staudenmeir/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查询。
第一个查询就是从数据库里查作者的。
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".)