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 - 限制计数()

Laravel Eloquent ORM 的本地作用域

如何使用 Laravel Eloquent 和 Laravel Query Builder 进行联合查询?

Laravel Eloquent ORM 与 Query builder 哪个更好?