【问题标题】:How to properly take and skip in Laravel 4如何在 Laravel 4 中正确地采取和跳过
【发布时间】:2014-02-20 09:06:47
【问题描述】:

在 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() 中输入一个非常大的数字来获取其余对象,但是有没有一种方法可以完全获取其余对象?

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    您可以将一个愚蠢的高值传递给take,它应该可以工作。我不知道还有什么办法。离开 take 调用不起作用,因为它会生成如下 SQL:

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

    而 MySQL(至少)需要 LIMITOFFSET

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

    但它并不优雅。此外,如果您在数据库很大时使用此方法来避免边缘情况,那么可能值得研究可以传递给 LIMIT 的最大数量!

    【讨论】:

    • 同意,我的用例只需要一个相对较大的数字就可以了。只是想知道当表很大时,这个高得离谱的数字是否会破坏数据库......
    • 很遗憾,我无法回答这个问题。我不明白为什么它会比做一个无限制的SELECT 更糟糕,对吧?
    【解决方案2】:

    我假设id 字段是您的主键并且具有INT/BIGINTtype,在这里您可以使用INT 类型4294967295BIGINT 类型18446744073709551615 的最大数字所以没有机会超过特定类型(INT/BIGINT)可以具有最大值的表中的行数。 MySQL Integer Types (Exact Value).

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

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

    来自MySqlDocumentation

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

    SELECT * FROM tbl LIMIT 95,18446744073709551615;
    

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

    SELECT * FROM tbl LIMIT 5,18446744073709551615;
    

    由于您要求提供确切的行数,因此您可能总是使用 count(*) - offsetIMO 您不需要这个并且可以避免计数查询。

    【讨论】:

      猜你喜欢
      • 2013-08-14
      • 1970-01-01
      • 2015-08-28
      • 2012-06-21
      • 2015-01-20
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多