laravel nova search relationship
라라벨 노바는 리소스 검색시 릴레이션 테이블에서 검색하는 기능을 제공하지 않습니다.
nova search relationship 는 이런 문제를 해결해주는 패키지로 Nova Resource 검색시 연관 테이블에서도 검색이 가능합니다.
설치
컴포저로 의존성을 설치합니다.
composer require titasgailius/search-relations
trait Titasgailius\SearchRelations\SearchesRelations
을 노바 기본 리소스에 추가합니다.
use Titasgailius\SearchRelations\SearchesRelations; abstract class Resource extends NovaResource { use SearchesRelations;
사용
Relation 검색을 하려는 Nova Resource 클래스에 $searchRelations property에 검색할 relation 과 컬럼을 선언해 줍니다.
배열의 key(Ex: user) 는 Model Class 에 정의한 relation 의 이름입니다. 즉 아래 예제는 Post 모델 클래스에 user() 라는 메서드가 정의되어야 합니다.
<?php class Post extends Resource { public static $model = \App\Models\Post::class; /** * The relationship columns that should be searched. * * @var array */ public static $searchRelations = [ 'user' => [ 'username', 'email', ], ];
property 대신 searchableRelations() 메서드를 구현해 주어도 동일하게 동작합니다.
/** * Get the searchable columns for the resource. * * @return array */ public static function searchableRelations(): array { return [ 'user' => [ 'username', 'email', ], ]; }
global search
Nova 의 글로벌 search 시 relation 을 같이 검색하려면 $globalSearchRelations
프로퍼티를 정의해 줍니다.
/** * The relationship columns that should be searched globally. * * @var array */ public static $globalSearchRelations = [ 'user' => ['email'], ];
또는 globallySearchableRelations() 메서드를 구현해도 됩니다.
/** * Get the searchable columns for the resource. * * @return array */ public static function globallySearchableRelations(): array { return [ 'user' => ['email'], ]; }
disable global search
global search 에서 제외하려면 $globalSearchRelations array 를 빈 값으로 설정합니다.
/** * The relationship columns that should be searched globally. * * @var array */ public static $globalSearchRelations = [];
또는 $searchRelationsGlobally
프로퍼티를 false 로 설정해도 됩니다.
/** * Determine if relations should be searched globally. * * @var array */ public static $searchRelationsGlobally = false;
Nested relation
relation 모델에서 또 다른 모델을 검색하려면 dot notation 으로 중첩해서 기술해 주면 됩니다.
예로 다음 코드는 user 모델과 연관된 country 의 code 컬럼을 같이 검색합니다.
/** * The relationship columns that should be searched. * * @var array */ public static $searchRelations = [ 'user.country' => ['code'], ];