divineomega/

laravel-omega-search

轻松地将智能搜索引擎添加到您的Laravel网站或Web应用程序

v2.1.0 2020-03-05 13:41 UTC

This package is auto-updated.

Last update: 2024-09-05 23:27:55 UTC


README

Omega Search允许您轻松地将智能搜索引擎添加到您的Laravel网站或Web应用程序。它可以配置为搜索您的任何Eloquent模型。

底层,这个使用了Omega Search包。

安装

您可以使用Composer安装此包。

composer require divineomega/laravel-omega-search

使用

要使用Laravel Omega Search,首先将OmegaSearchTrait添加到您要搜索的模型中。然后,您必须实现以下两个抽象方法。

  • getOmegaSearchFieldsToSearch() - 必须返回一个包含模型要搜索的字段的数组。
  • getOmegaSearchConditions() - 必须返回一个包含搜索条件的关联数组。例如:['active' => 1, 'discontinued' => 0]

设置完成后,可以通过在模型上调用静态方法omegaSearch($searchText)来执行搜索。该方法执行智能模糊搜索,并返回一个按相关性降序排列的相关记录的查询构建器。

然后,根据需要检索相关模型(->get())或分页(->paginate())。

连接表

如果您想搜索相关表的内容,可以使用连接。只需覆盖模型中的getOmegaSearchTablesToJoin,并返回一个包含OmegaSearchJoins的数组。

定义连接

通过相关键连接

有两种定义连接的方式。第一种是调用OmegaSearchJoin::joinTableByForeignKey方法。您必须传递本地表名和连接表名给此方法。

默认情况下,连接表上的键将是将连接表名单数化并附加_id的结果,本地表上的键将是id。这些可以手动使用此方法的第三和第四个参数进行设置。

下面是一个示例

    public function getOmegaSearchTablesToJoin()
    {
        return [
            OmegaSearchJoin::joinTableByForeignKey($this->getTable(), 'divisions'),
        ];
    }

    public function getOmegaSearchTablesToJoin()
    {
        return [
            OmegaSearchJoin::joinTableByForeignKey($this->getTable(), 'divisions', 'id', 'division_id),
        ];
    }

您可以将连接链式调用,如下所示

    public function getOmegaSearchTablesToJoin()
    {
        return [
            OmegaSearchJoin::joinTableByForeignKey($this->getTable(), 'divisions'),
            OmegaSearchJoin::joinTableByForeignKey('divisions', 'companies', 'id', 'company_id')
        ];
    }
手动连接

如果您想连接不通过相关键连接的表,您可以手动添加条件到连接。为此,创建一个新的OmegaSearchJoin对象并调用addCondition方法添加您的条件。您必须在构造函数中指定本地表名和连接表名。可选地,您可以指定连接类型,默认为JOIN

添加条件时,左侧的参数将自动添加本地表名,连接表名将添加到右侧的条件。

下面是一个示例

    public function getOmegaSearchTablesToJoin()
    {
        $join = new OmegaSearchJoin('contacts', 'divisions', 'INNER JOIN');
        $join->addCondition('gross_income', '>', 'annual_income');
        
        return [
            $join,
        ];
    }