[英]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"]
如果我介绍“Neil Armstrong”,我希望获得 id = 1 的用户。
如果我搜索“Juan Armstrong”,我希望得到 id = 2 的用户。
如果我搜索“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”查询。
因此,在您的情况下, name
和surname
是 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.