Laravel Eloquent пропустить, взять все?

Я заметил, что в Laravel, когда цепочка skip() Вы также должны использовать take() также. Я хочу пропустить первые n строк, а остальные взять. Метод take допускает только целые числа. Как я могу сделать это, не прибегая к каким-то хитрым приемам, таким как указание большого числа для take?

10

Решение

В основном, с каждым OFFSET, LIMIT должен быть предоставлен для работы mysql. Поэтому нет способа сделать это без разделения предела. Нам нужно немного php mojo, чтобы работать здесь.

Допустим, у нас есть Eloquent Class Attendance, Вот что должно работать:

//Getting count
$count = Attendance::count();
$skip = 5;
$limit = $count - $skip; // the limit
$collection = Attendance::skip($skip)->take($limit)->get();
18

Другие решения

Я думаю, что это не очень хороший ответ, потому что вы вынуждены сделать два запроса, правильный путь будет:

$collection = Attendance::skip($skip)->take($limit)->get();
$collection.shift();

Вы можете увидеть больше о коллекциях Вот

2

Если вы используете MySQL и не хотите иметь 2 запроса, чтобы получить максимальное количество строк, вы можете использовать максимальное значение INT PHP в качестве take() параметр, например take(PHP_INT_MAX),

Это потому, что Laravel Query Grammar бросает ограничение на целое число. Таким образом, вы не можете использовать большее число, чем это.

От MySQL документация по LIMIT:

Чтобы извлечь все строки от определенного смещения до конца результирующего набора, вы можете использовать некоторое большое число для второго параметра.

Например:

\App\User::skip(10)->take(PHP_INT_MAX)->get();
1
По вопросам рекламы [email protected]