2015-03-25 2 views
1

У меня есть большая БД, с 50000+ строками, я пытаюсь получить все строки, но, скажем, каждые 50 строк.Laravel Eloquent пропустить каждый N-й ряд

Я попытался это из Laravel документации: Смещение & Limit

$users = DB::table('users')->skip(10)->take(5)->get(); 

Но это будет пропускать только первые 10 строк и получить следующие 5 строк. Я не могу найти решение Eloquent для этой проблемы.

Есть anybode решить это раньше?

+0

Итак, вы хотите пропустить 50, затем взять ряд, затем пропустить 50 и взять еще один ряд? Вы делаете это, потому что вас беспокоит размер таблицы? Вы вообще обеспокоены тем, сколько времени потребуется на выполнение запроса? – user3158900

+0

@ user3158900 Ровно! DB слишком велик, чтобы отправлять JSON клиенту. Меня не волнует, как долго он займет запрос, так как он будет кэшироваться. – Jack

ответ

-1

Вы должны использовать петлю.

$start = 0; 
$skip = 50; 
$take = 1; 
$all = array(); 
do { 
    $partial = User::skip($start++ * $skip)->take($take)->get(); 
    $all = array_merge($all, (array) $partial); 
} while (count($partial) > 0); 

это займет 1 строку каждые 50skipped строки, так что первый, 51-й, сотый ... до конца стола

+0

Ваш метод работает, но для запроса требуется около 20 секунд, это очень много. Я нашел решение, которое занимает 400 мс. – Jack

+0

Ну, ты сказал, что тебя не волнует время! –

+0

Это правда, 2, 3 и даже 5 секунд в порядке. Но 20 секунд для строк 50 тыс.. Спасибо за ваше решение. – Jack

1

решаемые с использованием сырой запрос:

return DB::select(DB::raw(' 
    SELECT dateTime, row1, row2 
     FROM (
     SELECT @row := @row +1 AS rownum, dateTime, row1, row2 
      FROM (
       SELECT @row :=0 
      ) r, users 
     ) ranked 
     WHERE rownum % 50 = 0')); 

Это намного быстрее решение затем @ disf.asia.