Eloquent Where()를 사용하여 Laravel의 데이터베이스 조회를 최적화하는 방법

Eloquent Where()를 사용하여 Laravel의 데이터베이스 조회를 최적화하는 방법

2022-05-31 last update

30 minutes reading Databases PHP Frameworks PHP Laravel
이 시리즈의 앞부분에서 데이터베이스에 있는 목록에 링크를 구성하기 위해 프레젠테이션 프로그램을 업데이트했습니다.주 응용 프로그램 보기에 현재 데이터베이스에 등록된 모든 목록을 포함하는 메뉴가 표시되지만 아직 활성 링크가 없습니다.
이 절에서는 링크를 목록에 표시하기 위해 응용 프로그램에 새 루트를 만들 것입니다.Eloquent에서 where() 방법을 사용하여 데이터베이스 조회의 결과를 더 잘 필터링하는 방법도 배울 것입니다.
시작하려면 코드 편집기에서 routes/web.php 파일을 엽니다.
routes/web.php
파일에는 현재 다음과 같은 내용이 있습니다.
라우팅/네트워크.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::all()->sortDesc();
    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});
 
Route::get 응용 프로그램 항목 페이지로 호출되어 HTTP GET 라우팅을 정의합니다.응용 프로그램에 / 요청을 보내면 이 리셋 함수를 터치하여 색인 보기를 되돌려줍니다.
이제 링크 목록을 표시하기 위해 두 번째 루트를 만들 것입니다.slug는 사용자 친화적인 URL을 만드는 데 사용되는 짧은 문자열입니다.새 라우팅은 데이터베이스의 link_lists 테이블에서 목록을 조회해야 합니다. 이 목록의 slug 필드에는 제공된 URL 매개 변수가 포함되어 있습니다.이 세그먼트가 포함된 목록을 찾을 수 없으면 HTTP 404 또는 not found 오류를 알려야 합니다.
다음 코드는 {slug} 라는 동적 매개변수를 사용하여 GET 라우팅을 만듭니다.이제
  • 사용link-list웅변모델사용LinkList방법으로 데이터베이스를 조회하고slug를 검색조건으로 사용한다.where() 메서드는 한 객체만 반환하도록 합니다.
  • 지정한 slug가 있는 목록을 찾지 못하면 first() 방법으로 404 오류가 발생합니다.
  • 유효한 목록을 찾으면 색인 보기가 나타나고 목록을 템플릿 매개 변수로 제공합니다.
  • 제공 abort 매개 변수는 목록 메뉴를 구축하기 위한 것이고, 제공 $lists 매개 변수는 색인 보기의 현재 버전과 호환되기 위한 것입니다. 이 이름이 있는 변수를 순환하기 때문입니다.$links 파일의 아래쪽에 다음 코드가 있습니다.
    라우팅/네트워크.php
    Route::get('/{slug}', function ($slug) {
        $list = LinkList::where('slug', $slug)->first();
        if (!$list) {
            abort(404);
        }
     
        return view('index', [
            'list' => $list,
            'links' => $list->links,
            'lists' => LinkList::all()
        ]);
    })->name('link-list');
     
    
    완료되면 파일을 저장합니다.
    shortcuts 웅변모델을 인용하는 경로가 있지만 본 강좌에서 우리는 routes/web.php 방법을 어떻게 사용하여 학습하는지 중점적으로 소개할 것이다.
    새 라우팅이 예상대로 작동하는지 테스트하려면 브라우저로 이동하여 기본 목록 페이지의 링크에 액세스하십시오.이 시리즈의 모든 단계를 완료하고 데이터베이스가 비어 있지 않으면 기본 목록 페이지는 다음 로컬 주소에 있어야 합니다.
    http://localhost:8000/default
    
    이전과 같은 페이지를 볼 수 있지만 링크는 현재 기본 목록에 있는 링크만 표시됩니다.다른 목록이 있는 경우 URL에 강조 표시된 where() 세그먼트를 목록의 세그먼트로 대체하여 페이지에 액세스할 수 있습니다.
    새 라우팅이 구성되면 default Blade 방법을 사용하여 템플릿 보기에서 동적으로 링크 목록의 URL을 생성할 수 있습니다.또한 페이지 제목을 사용자 정의하여 목록을 사용할 수 있을 때 목록에 대한 정보를 표시할 수 있습니다.
    코드 편집기에서 파일 열기 route:
    resources/views/index.blade.php
    
    이 파일은 업데이트해야 할 두 줄이 있습니다.먼저 이 시리즈의 다른 부분에서 만든 메뉴를 포함하는 부제 단락을 찾습니다.현재 상황은 이렇다.
    리소스/보기/색인.칼날php
            <p class="subtitle">
                @foreach ($lists as $list)<a href="#" title="{{ $list->title }}" class="tag is-info is-light">{{ $list->title }}</a> @endforeach
            </p>
    
    resources/views/index.blade.phpblade 방법으로 하이퍼링크href를 업데이트하여 목록 페이지의 현재 URL을 포함합니다.이 메서드는 라우팅의 이름을 첫 번째 매개 변수로, URL 매개 변수는 메서드가 호출하는 추가 매개 변수로 제공해야 합니다.다음 강조 표시된 내용으로 route 문자를 대체합니다.
    리소스/보기/색인.칼날php
            <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 }}</a> @endforeach
            </p>
    
    다음은 링크 부분과 의 # 순환을 찾습니다.링크마다 목록 이름을 인쇄하는 방법foreach에 대한 다른 호출이 필요합니다.이것은 이전 예와 유사하지만, route() 변수를 통해 목록 대상에 접근하는 방식은 다르다.
    리소스/보기/색인.칼날php
                <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>
    
    다음에 다른 정보를 제공할 때, 목록에 대한 정보를 포함하기를 원할 수도 있습니다.$link 변수가 있는지 확인하고 사용할 수 있는 경우에만 목록 제목을 인쇄할 수 있습니다.
    다음 강조 표시된 코드로 섹션 $list 을 대체합니다.
            <h1 class="title">
                @if (isset($list))
                    {{ $list->title }}
                @else
                    Check out my awesome links
                @endif
            </h1>
    
    이것이 완성된 파일의 외관입니다.다음과 같은 변경 사항이 편리함을 위해 강조 표시됩니다.
    리소스/보기/색인.칼날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 }}</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>
        </div>
    </section>
    </body>
    </html>
    
    파일 내용을 업데이트한 후 파일을 저장합니다.
    이제 브라우저를 통해 응용 프로그램 홈 페이지에 접근할 수 있습니다.제공된 Docker Compose 설정을 사용하는 경우 응용 프로그램은 다음 로컬 주소를 통해 사용할 수 있어야 합니다.
    http://localhost:8000
    
    다음과 같은 화면 캡처 페이지를 얻을 수 있습니다.

    이 시리즈의 다음 부분에서 Laravel Eloquent에서 검색 결과를 정렬하는 방법을 배울 것입니다.