在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()中输入一个非常大的数字来获取其余的数字,但有没有一种方法可以完全取得其余的对象?
答案 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
字段是您的主键,并且type
为INT/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
您不需要此行,并且可以避免计数查询。