我有4个表在数据库和模型中相关如下:

Users (hasMany(communities), hasMany(comments), hasMany(submissions))
Communities (belongsTo(user), hasMany(submissions))
Submissions (belongsTo(community), belongsTo(user), hasMany(comments))
Comments (belongsTo(user) , belongsTo(submission))

现在。 如果我使用关系来获取,比如25个最新的提交,如下:

$submissions = Submission::simplePaginate(25);

在使用foreach循环结果后,我遇到了76个查询运行。

如果我使用以下的急切加载

$submissions = Submission::with(['user', 'community', 'comments'])->simplePaginate(25);

我遇到了4个最佳查询(我认为)。

现在,我的问题是,在社区上,我有一个名为active的数据库字段,它接受活动社区的1和非活动社区的0。 您可能已经猜到,之前的查询会返回所有内容,包括非活动社区。

我想到了急切的加载限制,所以我使用了以下内容:

$submissions = Submission::with([
      'community' => function($query) {
        $query->active();
      }
    ]  
  )->with(['user', 'comments'])->simplePaginate(25);

这仍然可以完成4个查询,但现在我遇到了另一个问题。 此方法过滤非活动社区,但仍会加载帖子,用户和评论。 现在我留下了一个结果,我从非活动社区获得帖子。

最后,我在阅读这个社区时尝试了以下内容:

   $submissions = Submission::whereHas(
    'community', function($query) {
      $query->active();
    }  
  )->with(['user', 'comments'])->simplePaginate(20);

所以,不是使用 - > with(),而是使用 - > whereHas()作为有人建议。 然而,虽然这会产生正确的结果,即它只给我来自活动社区的帖子,评论和用户,但现在它根据我从Laravel Debugbar得到的反馈在23个查询中完成。

这是正常的吗? 这是我通过Eloquent执行此操作的唯一方法,而无需使用连接编写自定义查询吗? 我是不是吹了23个问题?

任何帮助将不胜感激。

#1楼 票数:1

您的问题是,在您的案例中, active()范围正在为您要检索的每个社区运行查询20。

要优化此功能,您可以在Submission模型中建立特定关系,您可以主动过滤活动社区。

// Submission model

public function activeCommunities (){

    return $this->hasMany(Community::class)->whereActive(true); 
}

现在您的查询看起来像:

$submissions = Submission::with(['user', 'comments', 'activeCommunities])  
    ->simplePaginate(25);

这应该执行4个查询我相信。

希望这对你有所帮助。

#2楼 票数:0

所以,经过一段时间的修补,我找到了解决方案,但我仍然不确定。 我发布这个以供将来参考,因为它解决了我的问题。 我使用的代码如下

  $submissions = Submission::whereHas(
      'community', function($query) {
        $query->where('is_active', true);
      }
    )->with(['user', 'community'])->withCount('comments')
  ->paginate(25);

所以,我尝试使用whereHas()来检查模型是否存在,然后才真正急切地加载community模型,如果这有意义的话? 它似乎得到了我想要的结果,因为我现在执行总共4个查询来获取所有提交,以及相关信息,过滤非活动社区。

  ask by George Chatzipavlou translate from so

未解决问题?本站智能推荐:

1回复

为什么我不能在具有约束的急切加载关系上使用orderBy()?

这是我用来获取 $Classes 的查询。 我后来使用显示我的“队列”数据 我得到的输出是 所以它肯定是按“队列”模型id排序的。 如何按date列订购?
1回复

为什么不能在急切加载查询中使用groupBy()-Laravel

错误异常: 对于with()方法中的groupBy()调用 我已经看到一些帖子讨论如何管理这个问题,并且不可能在 eloquent 中使用groupBy()但我真的不明白为什么...... 要清楚: User和Pricelist模型与默认的timestamps()方法建立了多对多的关系。 我正在尝
1回复

Laravel急切加载查询问题

我在以下查询中遇到问题。 查询返回结果没有在eager函数中运行条件。 尽管我们已经为 $from_code 和 $to_code 赋值,但它没有附加这些内部条件。 它只返回 empperson 表中的所有数据,而不管分配给 $from_code 和 $to_code 的值。 我的 Empmaste
3回复

急切加载参数-laravel

我有Banks表和单独的services表 可以用 service_id =1 急切加载所有银行..有点像 先感谢您
1回复

Laravel分组急切加载

我想通过急切加载来实现一些分组 当我做这样的事情时: 这出来了: 但我想知道是否可以这样做: 为了获得这样的JSON: 我知道我可以使用Department::with('users')但是我想保持上面的相同查询以便不再进行另一个查询调用 如果不可能的话。 还有其他工作
1回复

Laravel的多级急切加载?

假设我有这些关系 我的问题是,使用Laravel eager loading时我们可以拥有多少个嵌套级别? 我已经尝试过这个查询并且它无法正常工作,有人可以建议解决这个问题吗?
2回复

具有动态约束的Laravel急切负载

任何人都可以帮助我了解以下代码为何起作用的原因 但是当我使用动态值时 在说 方法Illuminate \\ View \\ View :: __ toString()不得引发异常
2回复

Laravel急切加载资源收集

如何预先加载资源集合关系? 我制作了一个资源,它称为gravel_pits关系 在模型 M:M 关系上: 从 API 我得到它是这样的: 我可以通过这样做来急切地加载它 哪个有效……但我无法控制我真正想要返回的砾石坑的哪些属性,相反,急切加载将它们全部取出。 有一个简单的解决方法吗?