繁体   English   中英

Laravel Scout 多列搜索

[英]Laravel Scout search by multiple columns

我有一个具有以下字段的用户 model:

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

我创建了一个搜索栏来搜索用户。 我正在使用 Laravel 侦察员来查询这样的用户:

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

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

预期结果

鉴于我的数据库中的以下记录:

-[id=>1, name => "Neil", surname => "Armstrong"] -[id=>2, name => "Juan Manuel", surname = "Armstrong"]

  1. 如果我介绍“Neil Armstrong”,我希望获得 id = 1 的用户。

  2. 如果我搜索“Juan Armstrong”,我希望得到 id = 2 的用户。

  3. 如果我搜索“Manuel”,我希望得到 id = 2 的用户。

到目前为止我尝试了什么

使用原始 SQL 直接在数据库管理器中查询,我使用以下查询获得了情况 1 的预期结果:

SELECT id, name, surname, image
FROM users
WHERE CONCAT(name,' ', surname) = "Neil Armstrong";

对于其他两种情况,我尝试使用 orWhere() 方法。 但是,这似乎不能一起工作,无论如何将原始 SQL 与 eloquent 和 Scout 混合在一起似乎很脏。

有没有办法使用 Laravel Scout 来做这样的事情? 仅使用 Eloquent 的解决方案也很有用。

默认情况下,数据库引擎将对您配置为可搜索的每个 model 属性执行“where like”查询。

因此,在您的情况下, namesurname是 model 属性,“Neil Amstrong”查询将同时检查%Neil Armstrong% 没有匹配,所以没有结果。

您可以使用访问器创建新的fullName model 属性,并将该属性添加到User model 的toSearchableArray()方法中。

为您的User model 创建一个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属性并找到您的用户。

我遇到了同样的问题,最终,我从我的 Laravel 项目中完全删除了 Scout,并仅使用 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")) . "%";

有了这个,你提到的所有三点都应该实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM