我有两个主要问题,都与雄辩家的急切加载有关。
第一个问题:
由于我们已经急切地加载了关系,所以我们就在那里加载了对象。例如Tag::with('posts');
将急切地加载标签的所有帖子。那么,如果我想计算第一个标签的帖子数量,使用Tag::first()->posts()->count()
还是Tag::first()->posts->count()
更好?
我知道答案通常是第一个,因为我们不想加载所有集合,而是只想使用一个查询。然而,在这种情况下,我认为我们已经加载了集合,所以我们已经支付了成本,因此我觉得在这种情况下第二个会更好?
旁注:我知道在这种情况下我们可以使用withCount('posts')
,但我在这里的重点是了解何时使用关系计数与集合计数。
第二个问题:
我还想知道我们是否已经使用了Tag::with('posts')
,那么如果我想计算第一个标签的帖子,使用Tag::first()->posts()->count / Tag::first( )->posts->count
还是使用Tag::withCount('posts')->with('posts')
会更快我的后勤是,如果我们只需要计数,withCount()
是快速的,但如果我们已经加载了关系,同时也想获得计数呢?
计数的成本取决于数据库的大小。一种常见的方法是使用缓存。对于大型数据库,更快几乎总是意味着使用缓存,但缓存不会100%准确,因为缓存应该在设定的时间更新。
而且,如果您要对大型集合进行计数,那么必然会遇到内存问题。
对于第一种方法,您可以使用调试器来分析使用每种方法所发生的事情,从而学到很多东西。还要注意laravel的loadCount()
方法。