Laravel Красномовне обмеження та зміщення


80

Це моє

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

Я просто хочу взяти обмеження "продукт" Це неправильний шлях

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

Будь ласка, подай мені руку!

Дякую!



@ SangTrần Просто використовуйте products()замість products. І це спрацює.
Доан Тран

Як згадував Доан Тран, ви повинні викликати ці методи на конструкторі, а не колекцію. Колекції не мають методу skip.
lagbox

Будь ласка, додайте, яку версію Laravel ви використовуєте. Їх багато.
lagbox

Відповіді:


135
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

З laravel doc 5.2 https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset

пропустити / взяти

Щоб обмежити кількість результатів, повернутих із запиту, або пропустити задану кількість результатів у запиті (OFFSET), ви можете скористатися методами skip and take:

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

У laravel 5.3 ви можете писати ( https://laravel.com/docs/5.3/queries#ordering-grouping-limit-and-offset )

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

15

Швидко:

Laravel має швидкий метод пагінації, пагінат, який повинен передавати лише кількість даних, що відображаються на сторінці.


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

як налаштувати підкачку:

Ви можете використовувати цей offsetметод: limit, skip,,take

  • обмеження set зсуву: з чого починається налаштування зсуву, обмежуючи обсяг даних, які потрібно запитати

  • пропустити , взяти: пропустити пропускає кілька фрагментів даних і бере багато даних

наприклад:


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



Це повернеться порожнім для сторінок з рядками, меншими за межу, оскільки його зміщення виходить за межі області дії.
Jovanni G

10

laravel мають власну функцію skipдля offsetі takeдля limit. так само, як наведений нижче приклад запиту laravel: -

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

5

Ви можете використовувати skipта takeфункції, як показано нижче:

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

// skipслід передавати параметр як ціле число, щоб пропустити записи та початковий індекс

// takeотримує ціле число, щоб отримати значення no. записів після індексу запуску, визначеногоskip

РЕДАГУВАТИ

Вибачте. Мене неправильно зрозуміли з вашим запитанням. Якщо ви хочете щось на зразок пагінації, forPageметод буде працювати для вас. Метод forPage працює для колекцій.

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

напр

$products = $art->products->forPage($page,$limit);

Колекції не мають skipметоду.
lagbox





-1

Будь ласка, спробуйте так,

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

Дякую, я не, але це не працює. у моїй БД у статті є багато продуктів через таблицю 'article_product'. Я можу показати всі товари (наприклад, що пов'язано з article_id = 1)
Sang Trần
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.