0

我有两个主要问题,都与 eloquent 的热切加载有关。

第一个问题:

因为我们已经预先加载了关系,所以我们已经加载了对象。例如, Tag::with('posts'); 将急切地加载标签的所有帖子。那么如果我想计算第一个标签的帖子数量,使用Tag::first()->posts()->count()or会更好Tag::first()->posts->count()吗?

我知道通常答案是第一个,因为我们不想加载所有集合,而是只想使用一个查询来完成。但是,在这种情况下,我假设我们已经加载了集合,所以就像我们已经支付了成本一样,因此我觉得在这种情况下第二个会更好?

旁注:我知道我们可以withCount('posts')在这种情况下使用,但我的意思是了解何时使用关系计数与集合计数。

第二个问题:

我还想知道我们是否已经使用过 ,Tag::with('posts')那么如果我想计算第一个标签的帖子,使用Tag::first()->posts()->count / Tag::first( )->posts->count或使用会更快吗?的关系,同时也想得到计数?Tag::withCount('posts')->with('posts')withCount()

4

1 回答 1

0

计数的成本取决于您的数据库有多大。一种常见的方法是使用缓存。对于大型数据库,更快几乎总是意味着使用缓存,但缓存不会 100% 准确,因为缓存应该在设定的时间更新。

而且,如果您要在大型集合上运行 count,您肯定会遇到内存问题。

对于第一个,您可以使用调试器来分析使用每种方法发生的情况,从而学到很多东西。还要注意 laravel 的loadCount()方法。

于 2020-07-15T02:46:28.260 回答