2014-02-20 55 views
1

在Laravel 4中,我想要返回兩個部分的對象:前5個和其餘部分。我已經試過如下:如何正確採取和跳過Laravel 4

$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 

我知道我可以只是在採取(),以獲得他們的休息進入一個很大的數字,但有這需要的對象的完全休息的方法嗎?

回答

2

我假定id字段是主鍵,並具有INT/BIGINTtype,在這裏你可以使用的最大數量爲4294967295INT類型和BIGINT18446744073709551615所以沒有機會超過一個的行數表特定類型(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你不需要這一點,並能避免計數查詢。

+2

真的很翔實。非常感謝! – JustinHo

+0

很高興這是有益的和歡迎:-) –

3

你可以通過一個愚蠢的高價值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的最大數量!

+0

同意,我的用例只需要一個相對較大的數字,它應該工作。只是想知道如果這個可笑的高數字將破壞數據庫時,表是巨大的...... – JustinHo

+0

不幸的是,我不能回答這個問題。我不明白爲什麼它會比做一個非限制的'SELECT'更糟糕,對嗎? – alexrussell