web-dev-qa-db-fra.com

Laravel Éloquent sautez n, prenez tout?

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?

15
Helen Che

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();
24
Yousof K.

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

3
Franco Risso

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();
1
SubRed