Laravel Eloquent Query - 限制计数()
Posted
技术标签:
【中文标题】Laravel Eloquent Query - 限制计数()【英文标题】:Laravel Eloquent Query - limit on a count() 【发布时间】:2017-06-14 14:33:38 【问题描述】:我需要知道一个表是否有超过 50 行符合某些条件。因此,原始查询应如下所示:
SELECT COUNT(id) FROM (SELECT id FROM table WHERE conditions LIMIT 50)
但我无法通过 eloquent 做到这一点。这是我迄今为止尝试过的......
card::where( ... )->limit(50)->count("id");
...但这不起作用。它不会对限制进行子查询,因此限制变得无用。
如果不运行受限制的子查询,查询时间最多会延长 10 倍......恐怕它不会像我需要的那样可扩展。
【问题讨论】:
见这里:***.com/questions/15229303/… 【参考方案1】:我最终确实想出了一个解决方案,我只是没有发布它(直到现在)。您可以直接抓取第 50 条记录的 ID 来查看它是否存在:
$atLeastFifty = Card::offset(50)->value("id");
if(!empty($atLeastFifty))
// there are at least 50 records
else
// there are less than 50 records
当表中有大量记录时,这比count()
快得多。
【讨论】:
好把戏,应该是 IMO 接受的答案。 好点,因为其他答案并没有真正回答这个问题。我已将此作为公认的答案。【参考方案2】:如果您只想计算列数,请使用不带参数的count()
:
$numberOfRows = Card::where(....)->take(50)->count();
【讨论】:
不幸的是,take(50)
与count()
结合使用时,似乎与limit(50)
具有相同的效果。日志显示的查询实际上根本没有改变:P(查询仍然是select count(*) as aggregate from table where ... limit 50
而不是使用子查询)
@Eloquent 和 Query Builder 就是这样做的。如果这不适合您,您需要使用原始查询。以上是关于Laravel Eloquent Query - 限制计数()的主要内容,如果未能解决你的问题,请参考以下文章
Laravel:在“query-builder”或“eloquent”中更改原始查询
laravel 5.1 中 Eloquent 和 Query Builder 有啥区别?
Laravel Eloquent Query - 限制计数()