【问题标题】:Laravel Eloquent "with" return relations with limitLaravel Eloquent "with" 返回关系与限制
【发布时间】:2019-06-22 18:13:00
【问题描述】:

我在 Category 和 Article 模型之间有简单的 Laravel 关系。我需要返回所有类别的列表以及相关文章。

测试数据: 3 个类别和 15 篇文章(每个类别 5 篇文章)。
预期结果:所有类别的集合,每个类别有 2 篇最新相关文章

默认情况下我应该使用类似的东西:

Category::with('articles')->get();

没关系 - 我有 3 个类别。每个类别都有 5 条相关记录的“关系”。

接下来,我尝试了:

Category::with(['articles' => function ($query) {
    $query->orderBy('created_at', 'desc');
    $query->limit(2);
}])->get();

但这是错误的方式。 “原始”查询中的这种结构如下所示:

select * from `articles` where `articles`.`category_id` in (select id from categories) limit 2

所以它按预期返回了一个错误的结果...
我需要所有类别和每个类别的最新 2 篇文章(3 * 2 = 6 条记录)此查询仅返回 2 条记录

【问题讨论】:

  • 这只是我的错字...已编辑
  • 然后一目了然,应该可以正常工作。您可以发布实际结果而不是生成的查询吗?它应该是 Category 模型的集合,每个模型都有 0 个或多个链接文章。
  • Category::with('articles') 应该是 2 个查询,而不是 1 个。
  • 请查看“原始”查询。 select * from articles ... limit (2) 只返回了 2 条记录而不是 6
  • 你最后确实有一个限制 2。

标签: laravel eloquent relationship


【解决方案1】:

Laravel 对此没有原生支持。

我为它创建了一个包:https://github.com/staudenmeir/eloquent-eager-limit

在父模型和相关模型中使用 HasEagerLimit 特征。

class Category extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

class Article extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

然后您可以将->limit(2) 应用于您的关系。

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 2014-07-30
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多