php Laravel Scout多列搜索

eqqqjvef  于 2023-01-08  发布在  PHP
关注(0)|答案(2)|浏览(144)

我有一个包含以下字段的用户模型:

protected $fillable = [
    'name',
    'email',
    'password',
    'birthday',
    'surname'
];

我创建了一个搜索栏来搜索用户。我使用Laravel scout来查询用户,如下所示:

$matchingUsers = User::search($request->search)->get();

如果我只搜索名字或者只搜索姓氏,结果都很好,问题是在介绍名字和姓氏的时候,在这种情况下,我没有得到任何结果。

    • 预期成果**

根据我的数据库中的以下记录:

  • [id =〉1,姓名=〉"尼尔",姓氏=〉"阿姆斯特朗"]-[id =〉2,姓名=〉"胡安·曼努埃尔",姓氏=〉"阿姆斯特朗"]
    1.如果我引入"Neil Armstrong",我希望得到id = 1的用户。
    1.如果我搜索"JuanArmstrong",我希望得到id = 2的用户。
    1.如果我搜索"Manuel",我希望得到id = 2的用户。
    "我所尝试的"
    使用原始SQL直接在数据库管理器中查询,我使用以下查询得到了情况1的预期结果:
SELECT id, name, surname, image
FROM users
WHERE CONCAT(name,' ', surname) = "Neil Armstrong";

对于另外两种情况,我尝试使用orWhere()方法,但是,这两种方法似乎不能一起工作,而且无论如何,将原始SQL与雄辩和Scout混合起来似乎很脏。
有没有什么方法可以用拉瑞维尔侦察机来做这样的事情?一个只使用雄辩的解决方案也会很有用。

yxyvkwin

yxyvkwin1#

默认情况下,数据库引擎将对您配置为可搜索的每个模型属性执行“WhereLike”查询。
因此,在您的示例中,namesurname是模型属性,查询“Neil Amstrong”将检查这两个属性是否为%Neil Armstrong%,没有匹配项,因此没有结果。
可以使用访问器创建新的fullName模型属性,并将该属性添加到User模型上的toSearchableArray()方法中。
User模型创建一个fullName属性。

UserAttributes.php

trait UserAttributes
{
    public function getFullNameAttribute(): string
    {
        return $this->name." ".$this->surname;
    }
}

然后在User模型的toSearchableArray()方法中,包含fullName属性。

User.php

...

use UserAttributes;

public function toSearchableArray(): array
{
    $searchable = [];

    $searchable["fullName"] = $this->fullName;
    // add more model attributes to search against...

    return $searchable;
}

...

现在,当您查询“Neil Armstrong”时,数据库引擎将搜索fullName属性并找到您的用户。

oipij1gg

oipij1gg2#

我也遇到过同样的问题,最终,我把Scout从我的Laravel项目中完全移除,只使用Eloquent:

$user_query = User::query();
$user_query->where(DB::raw('concat(name, " ", surname)'), 'like', $request);
$user = $user_query->get();

对于$request,我做了:

$request = "%" . str_replace(" ", "%", request("query")) . "%";

这样,你提到的三点都应该实现。

相关问题