본문 바로가기
IT/PHP

Laravel - Scout(검색)

by Sungjun_ 2021. 3. 7.

laravel.kr/docs/8.x/scout

 

라라벨 8.x - Scout-검색

라라벨 한글 메뉴얼 8.x - Scout-검색

laravel.kr

위 링크를 참고하시면 됩니다.

 


 

먼저 컴포저 패키지 매니저를 사용해 스카우트를 설치해줍니다.

composer require laravel/scout

 

다음으로 scout.php 파일을 생성합니다.

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

 

위 명령어를 사용하면 config 폴더에 scout.php 파일이 생성됩니다.

 

scout.php 파일을 열어 아래 false 부분을 true로 바꿔줍니다.

'queue' => env('SCOUT_QUEUE', false),

 

Algolia 드라이버를 사용하기 때문에 컴포저로 설치해줍니다.

composer require algolia/algoliasearch-client-php

 

scout.php 파일 가장 아래로 내려가서 ID와 SECRET 값을 넣어줘야 하는데

Aloglia 사이트에 가서 회원가입을 해줍니다.

'algolia' => [
        'id' => env('ALGOLIA_APP_ID', ''),
        'secret' => env('ALGOLIA_SECRET', ''),
    ],

 

회원가입은 따로 설명하기 않겠습니다.

Dashboard로 들어가면

Dashboard

왼쪽에 위와 같은 메뉴가 나오는데 API Keys로 들어가줍니다.

 

API Keys

 

여기서 필요한 것은 Application ID와 Admin API Key입니다.

각각 scout.php에 들어가는 id와 secret입니다.

변수를 .env 파일에 정의해놨기 때문에 .env 파일로 가서 각 변수에 해당하는 값들을 입력해줍니다.

 

변수

.env 파일에 변수가 없으면 직접 만들어줍시다.

Id에 Application ID를 secret에 Admin API Key를 입력해줍니다.

identify에는 true를 입력합니다.

 

다음으로 자신이 검색 기능을 사용할 모델 파일을 열어주고 인덱스를 설정해줍니다.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Free extends Model
{
    use HasFactory;
    use Searchable;


    protected $fillable = ['title', 'story'];

    public function searchableAs()
    {
        return 'frees';
    }

}

 

다시 Algolia 대시보드로 돌아가서 indices 메뉴를 눌러줍니다.

그러면 오른쪽에 위와 같이 화면이 나옵니다.

Create Index 버튼을 눌러 자신이 검색기능을 사용할 테이블 명과 같은 이름으로 해줍니다.

저 같은 경우에는 테이블 이름이 frees이기 때문에 frees로 하겠습니다.

 

Upload record 버튼은 따로 누를 필요 없이 명령어로 데이터를 넣어줍니다.

테이블 안에 이미 저장된 데이터가 있다면 아래 명령어를 입력해줍니다.

php artisan scout:import "App\Models\모델명"

 

 

import

 

import 성공

 

Configure 버튼을 눌러줍니다.

버튼을 눌러 검색에 사용할 테이블 컬럼 명을 넣어줍니다.

저는 title과 story를 추가했습니다.

그리고 아래 쪽에 있는 세이브 버튼을 눌러줍니다.

 

그 다음 4번째 Configure 버튼을 눌러줍니다.

 

정렬 기능을 사용하려면 Alolia에서 따로 설정해주어야 합니다.

Add sort-by attribute 버튼을 눌러줍니다.

 

저는 id를 내림차순으로 정렬하게 했습니다.

추가했다면 저장버튼을 눌러줍시다.

 

이런 식으로 글과 검색 창을 준비해줍니다.

 

라우트를 작성하고

Route::get('/free/search', [FreeController::class, 'search'])->name('frees.search');

 

컨트롤러에 search 메소드를 만들어줍니다.

public function search(Request $request){
        $word = $request->search;
        $searches = Free::search($word)->paginate(10);

        return view('frees.search', compact(['searches', 'word']));
    }

 

페이지네이션을 사용해 한 페이지에 10개씩 게시물이 나오게했습니다.

저 같은 경우에는 따로 search 결과를 보여줄 search.blade.php 파일을 만들었습니다.

@extends('layouts.app')

@section('content')
    <div class="max-w-7xl mx-auto">
        <div class="max-w-7xl xl:max-w-5xl mx-auto mt-20 text-right">
            <a href="{{route('frees.create')}}"><span><i class="xi-pen pr-1"></i>글쓰기</span></a>
        </div>
        <div class="max-w-7xl xl:max-w-5xl mx-auto mt-6">
            <table class="w-full">
                <tr>
                    <td class="w-2/12"></td>
                    <td class="w-7/12"></td>
                    <td class="w-1/12"></td>
                    <td class="w-2/12"></td>
                </tr>
                @foreach($searches as $search)
                    <tr class="border-t">
                        <td class="text-center py-1">{{$search->id}}</td>
                        <td class="text-left"><a href="{{route('frees.show', $search->id)}}">{{$search->title}}</a></td>
                        <td class="text-center">{{$search->user_name}}</td>
                        <td class="text-center">{{$search->created_at->format('Y-m-d')}}</td>
                    </tr>
                @endforeach
            </table>
        </div>
        <div class="max-w-7xl xl:max-w-5xl mx-auto mt-20">
            {{$searches->appends('search', $word)->links()}}
        </div>
@stop

 

가장 아래쪽에 있는 div박스 페이지네이션 링크 부분입니다.

laravel.kr/docs/8.x/pagination

 

라라벨 8.x - 페이지네이션

라라벨 한글 메뉴얼 8.x - 페이지네이션

laravel.kr

페이지네이션은 위 링크를 참고해주세요.

저는 Dr로 검색을 해보겠습니다.

1페이지
2페이지

 

1페이지, 2페이지 둘 다 내림차순으로 제대로 나오는 것을 확인할 수 있습니다.

 

저 같은 경우에는 Algolia에 title, story 두 컬럼에서 검색 가능하게 했기 때문에

제목 또는 내용에서 해당 검색어가 있는 게시물이 다 출력됩니다.

'IT > PHP' 카테고리의 다른 글

Laravel - 컨트롤러 줄이기  (2) 2021.04.14
Laravel - 이미지 리사이즈  (1) 2021.03.09
Laravel - Pagination  (2) 2021.01.29
Laravel + vue : API(3)  (0) 2021.01.19
Laravel + vue : API(2)  (0) 2021.01.19

댓글