我有一个联系人表和一个contact_list表,一个contact_list有很多联系人,联系人表有一个 is_active 字段。
要获取contact_list的活动联系人数量,我可以使用查询生成器,如下所示:
$contact_list->contacts()->where('is_active', 1)->count();
如果联系人数量太大,查询将花费很长时间。 有没有更好的方法来实现这一点?
答案 0 :(得分:0)
据我所见,您希望优化请求的性能。
要实现您应该使用eager-loading,因此您的新请求应如下所示:
$contactList = App\ContactList::with(['contacts' => function ($query) {
$query->where('is_active', 1);
}])->count();
有关Laravel如何实现预加载的更多信息,请查看文档链接:eager-loading documentation
答案 1 :(得分:0)
使用InnoDB时,COUNT()对于具有百万行的表运行缓慢。 这是count()的问题,因为InnoDB引擎会按行锁定表,并且如果要定期更改表,那么count()函数就不容易了。
雄辩的ORM在InnoDB或MyISAM之间没有区别,因此count()进程总是触发类似SELECT COUNT(*) AS aggregate FROM table
之类的东西。
如果您使用此SELECT COUNT(1) FROM table
来更改查询,您将意识到count()过程会更快。
因此在Laravel中可以简化为:
Model::select(DB:raw('count(1)'))->first();
或者您的情况
$contact_list->contacts()->select()->where('is_active', 1)->count();