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'],
];



Ref