webard / nova-eloquent-searchable
Requires
- illuminate/contracts: ^10.0|^11.0
- laravel/nova: ^4.20
Requires (Dev)
- laravel/pint: ^1.0
README
此简单包包含两种解决方案
- 通过 Laravel Nova 方式,使用它们的搜索配置使 Eloquent 模型可搜索
- 引入具有可选值验证的附加搜索类
安装
composer require webard/nova-eloquent-searchable
像 Nova 资源一样搜索 Eloquent 模型
- 将
public static $search
或public static searchableColumns()
定义从 Nova 资源移动到模型。 - 将特质添加到您的 Nova 资源
use Webard\NovaEloquentSearchable\Trait\NovaEloquentSearch; class User extends Resource { use NovaEloquentSearch; }
- 将特质添加到您的模型
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
方法 - 更多可搜索类?
贡献
我们欢迎对此插件做出贡献以改进它!请按照以下步骤进行贡献
- 分叉存储库。
- 为您的功能或错误修复创建一个新分支。
- 进行更改并使用描述性消息提交更改。
- 将您的更改推送到您分叉的存储库。
- 向主存储库打开拉取请求。
许可证
此项目采用 MIT 许可证。有关详细信息,请参阅 LICENSE.md 文件。
联系方式
有关问题或支持,请请在 GitHub 上打开一个问题。