Laravel Eloquent Limit und Offset

76

Das ist meins

    $art = Article::where('id',$article)->firstOrFail();
    $products = $art->products;

Ich möchte nur ein Limit "Produkt" nehmen. Dies ist der falsche Weg

   $products = $art->products->offset($offset*$limit)->take($limit)->get();

Bitte helfen Sie mir!

Vielen Dank!

Sang Trần
quelle
Dies würde Ihnen helfen, stackoverflow.com/questions/27457249/…
SarangaR
@ SangTrần Verwenden Sie einfach products()anstelle von products. Und es wird funktionieren.
Doan Tran
Wie Doan Tran erwähnt hat, sollten Sie diese Methoden im Builder aufrufen, nicht in einer Sammlung. Sammlungen haben keine Methode skip.
Lagbox
Bitte fügen Sie hinzu, welche Version von Laravel Sie verwenden. Es gibt viele von ihnen.
Lagbox

Antworten:

127
skip = OFFSET
$products = $art->products->skip(0)->take(10)->get(); //get first 10 rows
$products = $art->products->skip(10)->take(10)->get(); //get next 10 rows

Aus Laravel Doc 5.2 https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset

überspringen / nehmen

Um die Anzahl der von der Abfrage zurückgegebenen Ergebnisse zu begrenzen oder eine bestimmte Anzahl von Ergebnissen in der Abfrage (OFFSET) zu überspringen, können Sie die folgenden Methoden verwenden:

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

In Laravel 5.3 können Sie schreiben ( https://laravel.com/docs/5.3/queries#ordering-grouping-limit-and-offset )

$products = $art->products->offset(0)->limit(10)->get(); 
Atiqur
quelle
15

Schnell:

Laravel hat eine schnelle Paginierungsmethode, paginate, die nur die Anzahl der pro Seite angezeigten Daten übergeben muss.


//use the paginate
Book::orderBy('updated_at', 'desc')->paginate(8);

So passen Sie Paging an:

Sie können diese Methode offsetverwenden: limit, skip, ,take

  • Offset , Limit: Wo beginnt die Offset-Einstellung, wodurch die abzufragende Datenmenge begrenzt wird?

  • Überspringen , Nehmen: Überspringen überspringt einige Daten und nimmt viele Daten

zum Beispiel:


Model::offset(0)->limit(10)->get();

Model::skip(3)->take(3)->get();


//i use it in my project, work fine ~

class BookController extends Controller
{
    public function getList(Request $request) {

        $page = $request->has('page') ? $request->get('page') : 1;
        $limit = $request->has('limit') ? $request->get('limit') : 10;

        $books = Book::where('status', 0)->limit($limit)->offset(($page - 1) * $limit)->get()->toArray();

        return $this->getResponse($books, count($books));
    }
}


water_ak47
quelle
Dies wird für Seiten mit Zeilen, die unter dem Grenzwert liegen, leer zurückgegeben, da der Versatz über den Bereich hinausgeht.
Jovanni G
10

Laravel haben eine eigene Funktion skipfür offsetund takefür limit. genau wie unten Beispiel einer Laravel-Abfrage: -

Article::where([['user_id','=',auth()->user()->id]])
                ->where([['title','LIKE',"%".$text_val."%"]])
                ->orderBy('id','DESC')
                ->skip(0)
                ->take(2)
                ->get();
Nageen Nayak
quelle
5

Sie können skipund takeFunktionen wie folgt verwenden:

$products = $art->products->skip($offset*$limit)->take($limit)->get();

// skipsollte param als ganzzahliger Wert übergeben werden, um die Datensätze und den Startindex zu überspringen

// takeerhält einen ganzzahligen Wert, um die Nr. zu erhalten. von Datensätzen nach dem Start Index definiert durchskip

BEARBEITEN

Es tut uns leid. Ich wurde mit Ihrer Frage missverstanden. Wenn Sie so etwas wie Paginierung möchten, forPagefunktioniert die Methode für Sie. Die forPage-Methode funktioniert für Sammlungen.

REf: https://laravel.com/docs/5.1/collections#method-forpage

z.B

$products = $art->products->forPage($page,$limit);
Ali
quelle
Sammlungen haben keine skipMethode.
Lagbox
2

Vielleicht das

$products = $art->products->take($limit)->skip($offset)->get();

Salem Megiddo
quelle
0

Probieren Sie diesen Beispielcode aus:

$art = Article::where('id',$article)->firstOrFail();

$products = $art->products->take($limit);
Pramodya Abeysinghe
quelle
0
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);

$chunk = $collection->forPage(2, 3);

$chunk->all();
Byron Jester Manalo
quelle
-1

Bitte versuchen Sie es so,

return Article::where('id',$article)->with(['products'=>function($products, $offset, $limit) {
    return $products->offset($offset*$limit)->limit($limit);
}])
Nisam
quelle
Danke, Nisam, aber es funktioniert nicht. In meiner Datenbank enthält ein Artikel viele Produkte über die Tabelle 'article_product'. Ich kann alle Produkte zeigen (zB die mit article_id = 1 verwandt sind)
Sang Trần