如何在Laravel 4中正确地进行和跳过

时间:2014-02-20 09:06:48

标签: php laravel laravel-4

在Laravel 4中,我希望将对象分为两部分:前5个和其余部分。我尝试了以下内容:

$firstFive = Category::take(5)->get(); // this works.

$theRest = Category::skip(5)->take(5)->get(); // this works

$theRest = Category::take('THE REST')->skip(5)->get(); // of course not working

我知道我可以在take()中输入一个非常大的数字来获取其余的数字,但有没有一种方法可以完全取得其余的对象?

2 个答案:

答案 0 :(得分:3)

你可以将一个愚蠢的高值传递给take,它应该有效。我不知道其他任何方式。离开take调用不起作用,因为它生成如下SQL:

/* MyModel::skip(2)->lists('id'); */
select `id` from `table` offset 2

MySQL(至少)需要LIMIT OFFSET

/* MyModel::take(9999999)->skip(2)->lists('id'); */
select `id` from `table` limit 9999999 offset 2

虽然不是很优雅。此外,如果您使用此方法避免数据库庞大时出现边缘情况,那么可能需要调查可以传递给LIMIT的最大数量!

答案 1 :(得分:2)

我认为id字段是您的主键,并且typeINT/BIGINT,您可以在这里使用INT类型{{1}的最大数字}和4294967295类型BIGINT因此,没有机会超出表中特定类型(18446744073709551615)可以具有其最大值的行数。 MySQL Integer Types (Exact Value)

此外,INT/BIGINT引擎(默认)可以默认存储MyISAM行。这是2^32行。可以使用4,294,967,296选项将其扩展为2^64,因此每个表最多支持--with-big-tables行。

2^64存储引擎对行数没有限制,但对表大小InnoDB有限制。这适合多少行取决于每行的大小。

来自64TB Documentation

  

从特定偏移量检索所有行直到结果的末尾   设置,您可以使用一些大数字作为第二个参数。这个   语句检索从第96行到最后一行的所有行:

MySql

使用一个参数,该值指定从结果集的开头返回的行数。那么,你可以使用以下来检索从第6行到最后一行的所有行:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

由于您询问了确切的行数,因此您可以始终使用SELECT * FROM tbl LIMIT 5,18446744073709551615; ,但count(*) - offset您不需要此行,并且可以避免计数查询。