【问题标题】:Laravel Eloquent limit results for relationshipLaravel Eloquent 关系的限制结果
【发布时间】:2017-03-29 15:15:08
【问题描述】:

我有一个简单的相册和图片设置,每个相册都有很多图片。我可以很好地获取所有数据,但我想将返回的图像数量限制为 3。我尝试过像这样传递闭包:

Album::with(['images' =>  function($query) { $query->take(3);}])->get();

这确实将图像数量限制为 3 个,但将图像总数限制为 3 个,但我想将每个相册限制为 3 个图像。因此,第一个相册将按预期显示 3 张图片,但所有其他相册都没有图片。

我尝试向我的模型添加一个新方法,如下所示:

public function limitImages()
{
    return $this->hasMany('App\Image')->limit(3);
}

我在我的控制器中调用它:

Album::with('limitImages')->get();

但这并不限制返回的图像数量

【问题讨论】:

  • 您是否尝试在第一次关闭尝试中使用$query->limit(3),而不是take(3)
  • 是的,我已经尝试在控制器和模型中交换 limit() 和 take(),但它仍然可以正常工作。返回第一张专辑的 2 张图片,其余专辑没有图片
  • 同样的情况。这是一个有趣的问题!
  • 你使用的是什么版本的 Laravel?
  • 这是昨天的 5.4 新副本(只是玩弄它不是一个严肃的项目)

标签: php laravel eloquent


【解决方案1】:

我觉得你很快就会遇到一个 N+1 的问题来尝试完成这个。只需在它返回的集合中执行:

Album::with('images')->get()->map(function($album) {
    $album->setRelation('images', $album->images->take(3));
    return $album;
});

【讨论】:

  • 原来如果有20张专辑,那么就会有20个额外的查询。以及如何在一个查询中完成?
  • with('images') eager 加载相册的图像,这将在 2 个查询中获取所有内容(一个用于相册,一个用于所有图像)。
猜你喜欢
  • 2021-01-26
  • 2015-01-03
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
相关资源
最近更新 更多