webard/nova-eloquent-searchable

1.0.0 2024-07-23 15:44 UTC

This package is auto-updated.

Last update: 2024-09-23 16:11:48 UTC


README

此简单包包含两种解决方案

  1. 通过 Laravel Nova 方式,使用它们的搜索配置使 Eloquent 模型可搜索
  2. 引入具有可选值验证的附加搜索类

安装

composer require webard/nova-eloquent-searchable

像 Nova 资源一样搜索 Eloquent 模型

  1. public static $searchpublic static searchableColumns() 定义从 Nova 资源移动到模型。
  2. 将特质添加到您的 Nova 资源
use Webard\NovaEloquentSearchable\Trait\NovaEloquentSearch;

class User extends Resource
{
    use NovaEloquentSearch;
}
  1. 将特质添加到您的模型
use Webard\NovaEloquentSearchable\Trait\EloquentSearchable;

class User extends Authenticatable
{
    use EloquentSearchable;
}

现在,您可以通过与 Laravel Nova 面板相同的方式搜索您的模型并返回值

$user = User::searchInDatabase('test@example.com')->first();

dump($user->name);

为了避免与 Laravel Scout 冲突,作用域被命名为 searchInDatabase,但如果您想使用其他名称,例如 search,只需重命名特质方法

class User extends Authenticatable
{
    use EloquentSearchable {
        scopeSearchInDatabase as scopeSearch;
    }
}

现在,您可以通过 search 方法进行搜索

$user = User::search('test@example.com')->first();

dump($user->name);

附加搜索类

Laravel Nova 随附一些 可搜索列类,但它们只能通过 MySQL 的 LIKE 或全文搜索进行搜索。

全文搜索非常强大,但“like”搜索在大数据集中效率低下,并且无法使用索引,因此此包在值验证功能的基础上衍生了几个附加类来优化搜索。

EqualValue

use Webard\NovaEloquentSearchable\Query\Search\EqualValue;


public static function searchableColumns(): array
{
    return [
        'name',
        (new EqualValue('email'))
    ];
}

EqualValue 用于搜索完整值。这是 MySQL 中的简单比较 WHERE column="value"。此搜索方法很有用,例如,用于通过电子邮件地址或电话号码搜索。

此外,您还可以添加值验证,以便如果传入的值不符合条件,则不会将其添加到搜索查询中。

use Webard\NovaEloquentSearchable\Query\Search\EqualValue;

public static function searchableColumns(): array
    {
        return [
            'name',
            (new EqualValue('email'))
                ->validate(fn($value) => Validator::make(
                    [
                        'value' => $value
                    ],
                    [
                        'value' => 'email'
                    ]
                )
                ->passes()
            ),
        ];
    }

EqualRelation

EqualRelation 类执行与 EqualValue 相同的操作,但基于关系而不是列。

示例

use Webard\NovaEloquentSearchable\Query\Search\EqualValue;

public static function searchableColumns(): array
    {
        return [
            'name',
            (new EqualRelation('additionalEmails', 'email'))
                ->validate(fn($value) => Validator::make(
                    [
                        'value' => $value
                    ],
                    [
                        'value' => 'email'
                    ]
                )
                ->passes()
            ),
        ];
    }

FullTextValue

FullTextValue 执行与 Laravel Nova 中的 SearchableText 类相同的操作,但此外还为搜索值添加了双引号(")。因此,如果您搜索 John Doe,则将 "John Doe" 值发送到 SQL 查询。这样,在全文模式下搜索更精确。

当然,与 EqualValue 一样,也存在值验证。

FullTextRelation

如上所述,但使用关系而不是列。

当然,与 EqualValue 一样,也存在值验证。

待办事项

我正在积极寻求贡献来增强此包。以下是我希望实现的一些功能

  • 测试
  • 向 Laravel Nova 可搜索类添加 validate 方法
  • 更多可搜索类?

贡献

我们欢迎对此插件做出贡献以改进它!请按照以下步骤进行贡献

  1. 分叉存储库。
  2. 为您的功能或错误修复创建一个新分支。
  3. 进行更改并使用描述性消息提交更改。
  4. 将您的更改推送到您分叉的存储库。
  5. 向主存储库打开拉取请求。

许可证

此项目采用 MIT 许可证。有关详细信息,请参阅 LICENSE.md 文件。

联系方式

有关问题或支持,请请在 GitHub 上打开一个问题。