Laravel Eloquent에서 검색 결과를 제한하고 페이지를 나누는 방법

Laravel Eloquent에서 검색 결과를 제한하고 페이지를 나누는 방법

2022-05-31 last update

38 minutes reading Databases PHP Frameworks PHP Laravel
이 시리즈에서는 Laravel Eloquent의 몇 가지 기능을 테스트하기 위해 프레젠테이션 프로그램에 새로운 링크를 추가해 왔습니다.새 링크를 추가할 때마다 메인 색인 페이지가 길어지는 것을 알 수 있습니다. 프로그램에 표시된 링크 수량에 제한이 없기 때문입니다.데이터베이스 항목의 수량이 비교적 적을 때 이것은 문제가 되지 않지만 장기적으로 보면 페이지의 불러오는 시간이 비교적 길고 한 페이지에서 전파되는 내용의 양이 비교적 많기 때문에 레이아웃을 더욱 읽기 어려울 수 있다.
이 시리즈의 이 부분에서 Laravel 웅변 조회의 결과 수를 제한하는 방법limit()을 어떻게 사용하는지, 그리고 simplePaginate() 방법을 사용하여 결과를 페이지로 나누는 방법을 배울 것입니다.

질의 결과 제한


우선, 색인 페이지에 표시된 링크 수를 제한하기 위해 주 응용 프로그램 루트 / 를 업데이트합니다.
먼저 코드 편집기에서 웹 라우팅 파일을 엽니다.
routes/web.php
그런 다음 주 경로 정의를 찾습니다.
라우팅/네트워크.php
Route::get('/', function () {
    $links = Link::all()->sortDesc();
    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});
강조 표시된 줄은 Link 모델all() 방법을 통해 데이터베이스에 있는 현재 모든 링크를 조회하는 것을 보여 줍니다.본 시리즈의 앞부분에서 말한 바와 같이 이 방법은 아버지Model 클래스를 계승하고 이 모델과 관련된 모든 데이터베이스 기록을 포함하는 집합을 되돌려줍니다.sortDesc() 방법은 결과 집합을 내림차순으로 정렬하는 데 사용된다.
현재 강조 표시된 줄을 데이터베이스 조회 정렬 방법orderBy()으로 변경합니다. 이 방법은 데이터베이스 단계에서 조회 결과를 정렬하는 것이지 all() 방법을 통해 설득력 있는 집합으로 되돌아오는 전체 줄을 간단하게 정렬하는 것이 아닙니다.검색 결과를 제한하기 위해 limit() 방법에 대한 체인 호출도 포함될 것입니다.마지막으로, 당신은 get() 방법으로 필터링된 결과집을 설득력 있는 집합으로 얻을 것입니다.
다음 코드로 주 노선을 바꿉니다.편의를 위해 변경 사항을 강조 표시하려면 다음과 같이 하십시오.
라우팅/네트워크.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 매개 변수를 처리하여 현재 요청 중인 페이지를 식별하고 나열할 페이지당 레코드 수에 따라 정확한 제한과 오프셋 데이터베이스를 사용하여 예상 결과 집합을 조회합니다.
현재 routes/web.php 의 웅변 조회를 업데이트하여 simplePaginate() 방법을 사용합니다. 이 방법은 이전과 다음 링크를 포함하는 기본 내비게이션을 생성합니다.paginate() 방법과 달리 simplePaginate() 조회 결과의 총 페이지 수를 표시하지 않습니다.
코드 편집기에서 파일 routes/web.php 을 엽니다.먼저 / 경로를 업데이트하고 limit(4)->get() 방법을 simplePaginate() 방법으로 호출합니다.
라우팅/네트워크.php
...
Route::get('/', function () {
    $links = Link::orderBy('created_at', 'desc')->simplePaginate(4);

    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});
...
다음은 같은 파일에서 /{slug} 루트 정의를 찾고 get() 방법을 simplePaginate() 방법으로 대체합니다.완성되면 코드는 다음과 같습니다.
라우팅/네트워크.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');
...
이것이 완성된 파일의 외관입니다.다음과 같은 변경 사항이 편리함을 위해 강조 표시됩니다.
라우팅/네트워크.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');

완료되면 파일을 저장합니다.
데이터베이스 조회는 현재 업데이트되었지만, 내비게이션 표시줄을 보여줄 코드를 포함하기 위해 전방 보기를 업데이트해야 합니다.routes/web.php를 사용하여 얻은 결과 Eloquent 집합은 simplePaginate()라는 방법을 포함하고 있으며, 이 방법을 전방 보기에서 호출하여 필요한 HTML 코드를 출력할 수 있으며, 이 코드는 페이지별 Eloquent 조회를 바탕으로 내비게이션 섹션을 보여 줍니다.
또한 페이지를 나누는 Eloquent 집합에서 links() 방법으로 고유의 paginator 대상에 접근할 수 있습니다. 이 대상은 여러 개helpful methods를 제공하여 현재 페이지와 여러 페이지의 내용을 얻을 수 있습니다.
코드 편집기에서 응용 프로그램 보기를 엽니다.
resources/views/index.blade.php
links() 클래스로 표시된 부분의 끝을 찾습니다. 이 클래스는 resources/views/index.blade.php 순환을 포함하고 이 순환에서 링크를 렌더링합니다.다음 코드를 섹션 뒤와 페이지의 최종 links 태그 앞에 놓습니다.
리소스/보기/색인.칼날php
        @if ($links->links()->paginator->hasPages())
            <div class="mt-4 p-4 box has-text-centered">
                {{ $links->links() }}
            </div>
        @endif
이 코드는paginator 대상에 접근하고 foreach 방법을 호출하여 여러 페이지의 결과가 있는지 확인합니다.이 방법이true로 돌아왔을 때, 페이지에 새로운 </div> 요소를 표시하고 hasPages() 방법을 호출하여 관련 웅변 조회의 내비게이션 링크를 출력합니다.
업데이트된 div 페이지의 모양은 다음과 같습니다.
리소스/보기/색인.칼날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/[email protected]/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개가 넘는 링크가 있을 때마다 새 탐색 모음이 표시됩니다.

기능적인 페이지가 있으면 내용을 추가할 수 있고 사용자와 검색엔진이 낡은 항목에 접근할 수 있도록 할 수 있습니다.특정 조건에 기반한 고정 수량의 결과만 필요하고 페이지를 나누지 않으면 links() 방법으로 조회를 간소화하고 유한한 결과 집합을 보장할 수 있습니다.