titasgailius/search-relations

2.0.1 2021-07-16 15:55 UTC

This package is auto-updated.

Last update: 2024-08-26 14:49:35 UTC


README

在 Laravel Nova 中搜索关系

此包允许您将关系列包含到 Laravel Nova 搜索查询中。

截图

screenshot of the search relations tool

安装

composer require titasgailius/search-relations

接下来,将 Titasgailius\SearchRelations\SearchesRelations 特性添加到您的基资源类 App\Nova\Resource

use Titasgailius\SearchRelations\SearchesRelations;

abstract class Resource extends NovaResource
{
    use SearchesRelations;

用法

简单地在您的任何 Nova 资源中添加 public static $searchRelations 变量。此数组接受一个关系名称作为键,一个可搜索列的数组作为值。

/**
 * The relationship columns that should be searched.
 *
 * @var array
 */
public static $searchRelations = [
    'user' => ['username', 'email'],
];

或者,您可以为返回可搜索关系的数组添加一个静态的 searchableRelations() 方法。

/**
 * Get the searchable columns for the resource.
 *
 * @return array
 */
public static function searchableRelations(): array
{
    return [
        'user' => ['username', 'email'],
    ];
}

全局搜索

通过定义 $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'],
    ];
}

禁用关系全局搜索

您可以通过声明一个空的数组 $globalSearchRelations 来禁用全局关系搜索。

/**
 * 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;

嵌套关系

您可以使用点符号来搜索嵌套关系。

/**
 * The relationship columns that should be searched.
 *
 * @var array
 */
public static $searchRelations = [
    'user.country' => ['code'],
];

扩展搜索

您可以通过返回一个实现 Search 接口的类来为指定的关系应用自定义搜索逻辑。

/**
 * Get the searchable columns for the resource.
 *
 * @return array
 */
public static function searchableRelations(): array
{
    return [
        'country' => new LocationSearch(['USA', 'UK']),
    ];
}

您的自定义搜索类必须实现一个简单的 Search 接口,该接口有一个方法,接受当前的查询 $query、关系名称 $relation 和搜索输入 $search

<?php

namespace Titasgailius\SearchRelations\Contracts;

use Illuminate\Database\Eloquent\Builder;

interface Search
{
    /**
     * Apply search for the given relation.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  string  $relation
     * @param  string  $search
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply(Builder $query, string $relation, string $search): Builder;
}

您可以查看 Titasgailius\SearchRelations\Searches\RelationSearch 类作为示例。