J'ai remarqué que dans Laravel lors du chaînage d'une skip()
, vous devez également utiliser take()
également. Je veux ignorer les n premières lignes mais prendre La méthode take n'autorise que les entiers, comment puis-je faire sans recourir à une astuce hacky telle que la spécification d'un grand nombre pour take?
Fondamentalement, avec chaque OFFSET, une LIMITE doit être fournie pour que mysql fonctionne. Par conséquent, il n'y a aucun moyen de le faire sans spécifier une limite. Nous avons besoin de php mojo pour travailler ici.
Disons que nous avons une classe éloquente nommée Attendance
. Voici ce qui devrait fonctionner:
//Getting count
$count = Attendance::count();
$skip = 5;
$limit = $count - $skip; // the limit
$collection = Attendance::skip($skip)->take($limit)->get();
Je pense que ce n'est pas une bonne réponse, car vous obligez à faire deux requêtes, la bonne façon sera:
$collection = Attendance::skip($skip)->take($limit)->get();
$collection.shift();
Vous pouvez en savoir plus sur les collections ici
Si vous utilisez MySQL et que vous ne voulez pas avoir 2 requêtes pour obtenir le nombre maximum de lignes, vous pouvez utiliser le PHP valeur INT maximale comme paramètre take()
par exemple take(PHP_INT_MAX)
.
C'est parce que Laravel Grammaire de requête convertit la limite en entier . Vous ne pouvez donc pas utiliser un nombre plus grand que cela.
De documentation MySQL sur LIMIT :
Pour récupérer toutes les lignes d'un certain décalage jusqu'à la fin de l'ensemble de résultats, vous pouvez utiliser un grand nombre pour le deuxième paramètre.
Par exemple:
\App\User::skip(10)->take(PHP_INT_MAX)->get();