Laravel Scout: 글로벌 검색 생성

이것은 이전 게시물의 연속성입니다.

전역 검색을 만들면 가능한지 질문을 받았습니다. 예 가능합니다. 우리는 프로그래머입니다. 우리는 사물이 어떻게 행동하고 행동해야 하는지 프로그램합니다.

경로와 도우미를 약간 변경하면 완료됩니다!

TLDR;

경로:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::middleware('auth:sanctum')->get('/search', function (Request $request) {
    abort_if(
        empty($request->search),
        404,
        'Please provide search keyword'
    );

    return search($request);
});


그리고 도우미:

<?php

use App\Enums\SearchType;
use Illuminate\Http\Request;
use Laravel\Scout\Searchable;

if (! function_exists('search')) {
    function search(Request $request = null)
    {
        if(is_null($request)) {
            $request = request();
        }

        $type = SearchType::tryFrom($request->type);
        $keyword = $request->search;
        $paginate = $request->query('paginate', false);
        $types = empty($type) ? SearchType::cases() : [$type];

        $data = [];
        foreach ($types as $type) {
            throw_if(
                ! in_array(Searchable::class, class_uses_recursive($type->value))
            );

            $class = $type->value;

            $query = $class::search($keyword);

            $data[$type->label] = $paginate
                ? $query->paginate()
                : $query->first();
        }

        return [
            'data' => $data,
            'meta' => [
                'searched_at' => date('Y-m-d H:i:s')
            ],
        ];
    }
}


또한 열거형을 업데이트하고 labels() 덮어쓰기를 제거합니다.

<?php

namespace App\Enums;

use Spatie\Enum\Laravel\Enum;

/**
 * @method static self user()
 * @method static self profile()
 */
class SearchType extends Enum
{
    public static function values(): array
    {
        return [
            'user' => \App\Models\User::class,
            'profile' => \Profile\Models\Profile::class,
        ];
    }
}


이제 끝났습니다! 전역 검색이 실행 중입니다.

좋은 웹페이지 즐겨찾기