我有一个包含以下字段的用户模型:
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混合起来似乎很脏。
有没有什么方法可以用拉瑞维尔侦察机来做这样的事情?一个只使用雄辩的解决方案也会很有用。
2条答案
按热度按时间yxyvkwin1#
默认情况下,数据库引擎将对您配置为可搜索的每个模型属性执行“WhereLike”查询。
因此,在您的示例中,
name
和surname
是模型属性,查询“Neil Amstrong”将检查这两个属性是否为%Neil Armstrong%
,没有匹配项,因此没有结果。可以使用访问器创建新的
fullName
模型属性,并将该属性添加到User
模型上的toSearchableArray()
方法中。为
User
模型创建一个fullName
属性。然后在
User
模型的toSearchableArray()
方法中,包含fullName
属性。现在,当您查询“Neil Armstrong”时,数据库引擎将搜索
fullName
属性并找到您的用户。oipij1gg2#
我也遇到过同样的问题,最终,我把Scout从我的Laravel项目中完全移除,只使用Eloquent:
对于
$request
,我做了:这样,你提到的三点都应该实现。