آموزش معرفی و بررسی

چگونه می توان نتایج پرس و جو را در Laravel Eloquent محدود و پیج بندی کرد

در طول این مجموعه ، شما پیوندهای جدیدی را به برنامه نمایشی خود اضافه کرده اید تا چندین ویژگی از Laravel Eloquent را آزمایش کنید. شاید متوجه شده باشید که صفحه فهرست اصلی هربار که پیوند جدیدی اضافه می کنید طولانی تر می شود ، زیرا محدودیتی در تعداد پیوندهای نشان داده شده در برنامه وجود ندارد. اگرچه وقتی تعداد اندکی از ورودی های پایگاه داده را دارید ، مشکلی ایجاد نمی شود ، اما در طولانی مدت ممکن است زمان بارگذاری صفحه شما طولانی تر شود ، و چیدمانی که بخاطر میزان انتشار محتوا در آن خواندن مشکل تر است. یک صفحه واحد

در این قسمت از سری ، نحوه محدود کردن تعداد نتایج در پرس و جو Laravel Eloquent با روش limit () و نحوه صفحه بندی نتایج با روش simplePaginate () را خواهید آموخت.

محدود کردن نتایج پرس و جو

برای شروع ، مسیر اصلی برنامه (/) خود را به روز می کنید تا تعداد پیوندهایی که در صفحه فهرست شما فهرست شده اند محدود شود.

با باز کردن فایل مسیرهای وب خود در ویرایشگر کد شروع کنید:

routes/web.php

سپس ، تعریف مسیر اصلی را پیدا کنید:

routes/web.php
Route::get('/', function () {
    $links = Link::all()->sortDesc();
    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});

خط برجسته پرس و جو را نشان می دهد که تمام پیوندهای موجود در پایگاه داده را از طریق متد Link model all () دریافت می کند. همانطور که در قسمت قبلی این سری توضیح داده شد ، این روش از کلاس Model وراثت می شود و مجموعه ای را با تمام رکوردهای پایگاه داده مرتبط با آن مدل باز می گرداند. روش sortDesc () برای مرتب سازی مجموعه حاصله به ترتیب نزولی استفاده می شود.

اکنون خط برجسته را برای استفاده از روش مرتب سازی پرس و جو پایگاه داده orderBy () تغییر می دهید ، که نتایج پرس و جو را در سطح پایگاه داده سفارش می دهد ، به جای این که مجموعه کامل ردیف هایی را که به عنوان مجموعه فصیح از طریق روش (() بازگردانده می شوند ، به سادگی مرتب کنید. به همچنین برای محدود کردن نتایج پرس و جو ، یک روش زنجیره ای به روش limit () اضافه می کنید. در نهایت ، از روش get () برای بدست آوردن مجموعه نتایج فیلتر شده به عنوان مجموعه ای فصیح استفاده خواهید کرد.

مسیر اصلی خود را با کد زیر جایگزین کنید. این تغییر برای راحتی شما برجسته شده است:

routes/web.php
Route::get('/', function () {
    $links = Link::orderBy('created_at', 'desc')->limit(4)->get();

    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});

کد به روز شده اکنون آخرین 4 پیوند اضافه شده به پایگاه داده را بدون توجه به اینکه در کدام لیست قرار دارد ، می کشد. از آنجا که همه پیوندها به لیست ها اضافه می شوند ، بازدیدکنندگان همچنان می توانند برای مشاهده لیست کامل پیوندها به لیست های خاصی مراجعه کنند.

در مرحله بعد ، نحوه صفحات بندی نتایج را یاد می گیرید تا مطمئن شوید همه پیوندها همچنان در دسترس هستند ، حتی اگر همه آنها به یکباره در یک صفحه بارگیری نشوند.

نتایج جستجوی پیجینی

صفحه فهرست شما اکنون تعداد پیوندهای فهرست شده را محدود می کند ، به طوری که صفحه شما با محتوا بیش از حد بارگیری نمی شود و در مدت زمان کوتاه تر ارائه می شود. در حالی که این راه حل در بسیاری از موارد خوب عمل می کند ، باید مطمئن شوید که بازدیدکنندگان هنوز می توانند به پیوندهای قدیمی که به طور پیش فرض قابل مشاهده نیستند دسترسی داشته باشند. مؤثرترین روش برای انجام این کار پیاده سازی صفحه بندی است که در آن کاربران می توانند بین چندین صفحه نتایج حرکت کنند.

Laravel Eloquent روشهای بومی برای تسهیل پیاده سازی صفحه نتایج جستار پایگاه داده دارد. روشهای paginate () و simplePaginate () به ایجاد پیوندهای صفحه بندی ، رسیدگی به پارامترهای HTTP برای شناسایی صفحه ای که در حال حاضر درخواست می شود ، و جستجوی پایگاه داده با محدودیت و جابجایی صحیح به منظور دستیابی به مجموعه مورد انتظار نتایج ، بستگی دارد. تعداد سوابق در هر صفحه ای که می خواهید لیست کنید.

اکنون می توانید پرس و جوهای Eloquent را در route/web.php به روز کنید تا از متد simplePaginate () استفاده کنید ، که با پیوندهای قبلی و بعدی یک ناوبری اساسی ایجاد می کند. بر خلاف روش paginate () ، simplePaginate () اطلاعاتی درمورد تعداد کل صفحات در نتیجه پرس و جو نشان نمی دهد.

فایل route/web.php را در ویرایشگر کد خود باز کنید. با به روز رسانی / route ، جایگزین محدودیت (4)-> فراخوانی متد get () با متد () simplePaginate:

routes/web.php
...
Route::get('/', function () {
    $links = Link::orderBy('created_at', 'desc')->simplePaginate(4);

    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});
...

 

در مرحله بعد ، تعریف مسیر /{slug} را در همان فایل قرار دهید و متد get () را با روش simplePaginate () جایگزین کنید. پس از اتمام کار کد باید به این شکل باشد:

routes/web.php
...
Route::get('/{slug}', function ($slug) {
    $list = LinkList::where('slug', $slug)->first();
    if (!$list) {
        abort(404);
    }

    return view('index', [
        'list' => $list,
        'links' => $list->links()->orderBy('created_at', 'desc')->simplePaginate(4),
        'lists' => LinkList::all()
    ]);
})->name('link-list');
...

پس از اتمام کار ، مسیرهای نهایی/فایل web.php به این شکل ظاهر می شود. تغییرات برای راحتی شما برجسته شده است:

routes/web.php
<?php

use Illuminate\Support\Facades\Route;
use App\Models\Link;
use App\Models\LinkList;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    $links = Link::orderBy('created_at', 'desc')->simplePaginate(4);

    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});

Route::get('/{slug}', function ($slug) {
    $list = LinkList::where('slug', $slug)->first();
    if (!$list) {
        abort(404);
    }

    return view('index', [
        'list' => $list,
        'links' => $list->links()->orderBy('created_at', 'desc')->simplePaginate(4),
        'lists' => LinkList::all()
    ]);
})->name('link-list');

پس از اتمام فایل را ذخیره کنید.

درخواست های پایگاه داده در حال حاضر به روز شده اند ، اما شما هنوز هم باید نمای جلویی خود را به روز کنید تا کدی را که نوار ناوبری را نشان می دهد ، شامل شود. مجموعه Eloquent به دست آمده با () simplePaginate شامل روشی به نام () است که می تواند از نمای جلویی فراخوانی شود تا کد HTML لازم را برای خروجی بخش ناوبری بر اساس یک پرس و جوی صفحه بندی شده ارائه دهد.

همچنین می توانید از روش پیوندها () در یک مجموعه صفحه بندی شده Eloquent برای دسترسی به شی صفحه بندی کننده ذاتی استفاده کنید ، که چندین روش مفید را برای به دست آوردن اطلاعات در مورد محتوا مانند صفحه فعلی و اینکه صفحات متعدد محتوا وجود دارد یا خیر ، ارائه می دهد.

نمای برنامه منابع/views/index.blade.php را در ویرایشگر کد خود باز کنید:

resources/views/index.blade.php

انتهای بخش دارای برچسب کلاس پیوندها را مشخص کنید ، که شامل حلقه foreach است که پیوندها در آن رندر می شوند. کد زیر را بعد از آن بخش و قبل از برچسب </div> آخر در آن صفحه قرار دهید:

resources/views/index.blade.php
@if ($links->links()->paginator->hasPages())
    <div class="mt-4 p-4 box has-text-centered">
        {{ $links->links() }}
    </div>
@endif

ین کد با دسترسی به شی paginator و فراخوانی متد hasPages () ، وجود چندین صفحه از نتایج را بررسی می کند. وقتی این متد true می شود ، صفحه یک عنصر div جدید ارائه می دهد و متد links () را برای چاپ پیوندهای ناوبری برای پرس و جو مربوط به Eloquent فراخوانی می کند.

پس از اتمام کار ، صفحه به روز شده index.blade.php به این شکل خواهد بود:

resources/views/index.blade.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>My Awesome Links</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css">

    <style>
        html {
            background: url("https://i.imgur.com/BWIdYTM.jpeg") no-repeat center center fixed;
            -webkit-background-size: cover;
            -moz-background-size: cover;
            -o-background-size: cover;
            background-size: cover;
        }

        div.link h3 {
            font-size: large;
        }

        div.link p {
            font-size: small;
            color: #718096;
        }
    </style>
</head>
<body>
<section class="section">
    <div class="container">
        <h1 class="title">
            @if (isset($list))
                {{ $list->title }}
            @else
                Check out my awesome links
            @endif
        </h1>
        <p class="subtitle">
            @foreach ($lists as $list)<a href="{{ route('link-list', $list->slug) }}" title="{{ $list->title }}" class="tag is-info is-light">{{ $list->title }} ({{ $list->links()->count() }})</a> @endforeach
        </p>

        <section class="links">
            @foreach ($links as $link)
                <div class="box link">
                    <h3><a href="{{ $link->url }}" target="_blank" title="Visit Link: {{ $link->url }}">{{ $link->description }}</a></h3>
                    <p>{{$link->url}}</p>
                    <p class="mt-2"><a href="{{ route('link-list', $link->link_list->slug) }}" title="{{ $link->link_list->title }}" class="tag is-info">{{ $link->link_list->title }}</a></p>
                </div>
            @endforeach
        </section>

        @if ($links->links()->paginator->hasPages())
            <div class="mt-4 p-4 box has-text-centered">
                {{ $links->links() }}
            </div>
        @endif
    </div>
</section>
</body>
</html>

پس از اتمام به روزرسانی فایل را ذخیره کنید. اگر به پنجره مرورگر خود برگردید و صفحه برنامه را دوباره بارگیری کنید ، هرگاه بیش از 4 پیوند در فهرست کلی یا در هر صفحه فهرست پیوندهای جداگانه داشته باشید ، به یک نوار ناوبری جدید توجه خواهید کرد.

با یک صفحه بندی کاربردی در محل ، می توانید محتوای خود را افزایش دهید در حالی که مطمئن می شوید که اقلام قدیمی هنوز در دسترس کاربران و موتورهای جستجو هستند. در مواردی که شما فقط به مقدار مشخصی از نتایج بر اساس معیارهای خاصی نیاز دارید ، درصورتی که صفحه بندی لازم نیست ، می توانید از روش limit () برای ساده سازی پرس و جو و تضمین مجموعه محدود نتایج استفاده کنید.


https://vpsgol.net/product/vps-germany/

https://vpsgol.net/product/vps-usa/

https://vpsgol.net/product/vps-france/

https://vpsgol.net/product/vps-canada/

https://vpsgol.net/product/vps-poland/

https://vpsgol.net/product/vps-netherlands/

https://vpsgol.net/product/vps-england/