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!



@ 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(); 

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));
    }
}



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

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);

Sammlungen haben keine skipMethode.
Lagbox

2

Vielleicht das

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


0

Probieren Sie diesen Beispielcode aus:

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

$products = $art->products->take($limit);

0
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);

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

$chunk->all();


-1

Bitte versuchen Sie es so,

return Article::where('id',$article)->with(['products'=>function($products, $offset, $limit) {
    return $products->offset($offset*$limit)->limit($limit);
}])

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.