2014-02-20 4 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을 가지고 있으며, 여기에 당신이 그렇게 행 수를 초과 할 기회가없는 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입니다. 이 행에 맞는 행 수는 각 행의 크기에 따라 다릅니다.

DocumentationMySql에서 :

이 결과 세트의 마지막까지 오프셋 특정의 모든 행을 검색하려면, 당신은 두 번째 매개 변수에 대한 몇 가지 큰 번호를 사용할 수 있습니다. 이 문은 마지막 96 번째 행에서 모든 행을 검색합니다

하나 개의 인수로
SELECT * FROM tbl LIMIT 95,18446744073709551615; 

이 값은 결과 집합의 시작부터 반환 할 행의 수를 지정합니다. 그래서, 당신은 마지막으로 여섯 번째 행에서 모든 행을 검색하려면 다음을 사용할 수 있습니다 :

SELECT * FROM tbl LIMIT 5,18446744073709551615; 

당신이 행의 정확한 숫자를 요구하기 때문에 다음 당신은 항상 사용할 수있다 count(*) - offset하지만 IMO이 필요하고 할 수 없습니다를 카운트 쿼리를 피하십시오.

+2

정말 유익한. 고마워요! – JustinHo

+0

도움이 되셨고 반갑습니다. :-) –

3

어리석게 높은 값을 take에 전달하면 제대로 작동합니다. 나는 다른 어떤 길도 모른다. 이 같은 SQL을 생성으로, 작동하지 않습니다 take 호출을 떠나 :

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

을 그리고 MySQL은 (적어도)하는 것은 OFFSETLIMIT이 필요합니다.

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

그래도 우아하지 않습니다. 또한이 방법을 사용하여 DB가 큰 경우 엣지 케이스를 피하려면 LIMIT으로 전달할 수있는 최대 수를 조사하는 것이 좋습니다!

+0

동의하면 내 유스 케이스는 비교적 큰 숫자 만 필요하며 작동해야합니다. 엄청나게 높은 숫자가 테이블이 거대 할 때 데이터베이스를 깨뜨리는 지 궁금합니다. – JustinHo

+0

불행히도 나는 대답 할 수 없습니다. 나는 왜 제한적이지 않은'SELECT'를하는 것보다 더 나쁠 것 같지 않은가? – alexrussell

관련 문제