
Bug编译狮
标题:Laravel Eloquent:使用LIKE和NOT LIKE操作符
在Laravel Eloquent中,你可以使用LIKE和NOT LIKE操作符来查询数据库中的数据。这两个操作符在SQL中是相似的,但它们用于不同的上下文。
使用 LIKE 操作符
LIKE操作符用于查找字符串中包含特定模式的记录。语法如下:
$users = User::where('name', 'LIKE', '%John%')->get();
在这个例子中,WHERE name LIKE '%John%' 表示从User表中选择所有name字段中包含“John”的记录。
使用 NOT LIKE 操作符
NOT LIKE操作符用于查找字符串中不包含特定模式的记录。语法如下:
$users = User::where('name', 'NOT LIKE', '%John%')->get();
在这个例子中,WHERE name NOT LIKE '%John%' 表示从User表中选择所有name字段中不包含“John”的记录。
示例代码
假设我们有一个名为Users的模型,并且我们希望获取所有姓氏为“Doe”的用户,可以这样做:
use AppModelsUser;
$doeUsers = User::where('last_name', 'LIKE', '%Doe%')->get();
如果你想排除姓氏为“Smith”的用户,可以这样写:
$someOtherUsers = User::where('last_name', 'NOT LIKE', '%Smith%')->get();
通过这些方法,你可以灵活地使用LIKE和NOT LIKE操作符来过滤数据库中的数据。

黑板Bug讲师
介绍
Laravel的Eloquent ORM是一个强大的工具,使得数据库操作变得轻而易举。当我们需要实现搜索功能或根据模式过滤结果时,就需要使用SQL中的‘LIKE’和‘NOT LIKE’运算符了。在这篇教程中,我们将学习如何在Laravel的Eloquent中使用这些运算符来编写有效的查询。
在我们深入探讨之前,请确保您的Laravel项目已设置好数据库连接,并且您已经准备好了相应的模型,用于处理数据库表的数据。
理解“LIKE”和“NOT LIKE”的含义
在SQL中的“LIKE”操作符用于在列中查找指定模式。例如,这里有一个使用“LIKE”的简单SQL查询:
SELECT * FROM users WHERE name LIKE '%doe%';在Eloquent中,等价的表达方式是:
$users = User::where('name', 'LIKE', '%doe%')->get();百分号符号是一个通配符,表示“任意字符序列”。因此,上述查询会匹配所有姓名中含有“doe”的用户。
同样,“NOT LIKE”用于排除具有特定模式的记录。在纯SQL中,它看起来像这样:
SELECT * FROM users WHERE name NOT LIKE '%doe%';在Eloquent中,你也用“NOT LIKE”类似的方式来操作:
$users = User::where('name', 'NOT LIKE', '%doe%')->get();大小写敏感性
默认情况下,在使用MySQL或PostgreSQL时,’LIKE’查询是不区分大小写的;但在SQLite或SQL Server上,’LIKE’操作是区分大小写的。当您的应用程序可能运行在多个数据库上时,请务必考虑这一点。
“LIKE”的基本用法。
假设你在构建用户管理系统,需要从名字中含有“jo”的用户中获取数据。在Eloquent中,你可以这样写:
$users = User::where('name', 'LIKE', '%jo%')->get();这将返回包含 ‘jo’ 在 ‘name’ 列中的用户模型集合。
正在搜索“NOT LIKE”。
现在考虑一个场景,你想排除所有名字中有“jo”的用户。Eloquent 方法可能是:
$users = User::where('name', 'NOT LIKE', '%jo%')->get();这将会获取所有名字中不包含“jo”的用户。
结合条件
Linguistic flexibility enables you to link several ‘where’ clauses to construct more precise queries. As an illustration, you may wish to locate users bearing the name “John” who are devoid of “Doe” within their e-mail address.
$users = User::where('name', 'LIKE', '%john%')
->where('email', 'NOT LIKE', '%doe%')
->get();在这种情况下,Eloquent 会将条件用“AND”运算符组合起来,生成一个查询,该查询针对名为“john”的用户,并过滤掉任何包含“doe”在电子邮件地址中的用户。
使用 orWhere 与 LIKE 是什么意思?
如果你想要扩大搜索范围,包括名为“约翰”或“简”的用户,请参考以下示例:您可以使用orWhere子句来实现这一点。
$users = User::where('name', 'LIKE', '%john%')
->orWhere('name', 'LIKE', '%jane%')
->get();该查询将返回姓名中含有“john”或“jane”的用户。
喜欢与关系
你可以对相关模型执行“LIKE”查询。例如,如果用户有帖子,我们想找到包含特定关键词的用户的帖子,一种实现方法如下:
$users = User::whereHas('posts', function ($query) {
$query->where('content', 'LIKE', '%keyword%');
})->get();这个查询根据用户帖子的内容来过滤用户。
使用通配符的技巧
通配符非常强大。%keyword% 会找到包含 keyword 的任何记录的任意位置。keyword% 会匹配以 keyword 开头的所有条目,而 %keyword 则会匹配以 keyword 结尾的所有条目。因此,您需要决定在何处需要灵活性,在何处需要具体性。此外,请记住,前导通配符可能会因全表/索引扫描而导致性能下降。
安全:防止SQL注入
防止用户输入与数据库查询直接交互非常重要。Laravel的Eloquent通过使用参数绑定来处理这种情况。以下是安全地处理用户输入的方法:
$searchTerm = request('name');
$users = User::where('name', 'LIKE', "%{$searchTerm}%")->get();这确保了搜索词安全绑定到查询,从而防止潜在的SQL注入攻击。
大小写敏感性提示
如果你需要在处理的是区分大小写的数据库的情况下进行模糊查询,那么可能你需要使用带有适当SQL函数的原始查询语句。对于像PostgreSQL这样的数据库,你可以使用ILIKE操作符作为替代方案:
$users = User::whereRaw('LOWER(name) LIKE ?', [strtolower('%john%')])->get();记得谨慎使用原始表达式,因为不当的处理可能会导致SQL注入攻击。
结论。
在Laravel处理数据库时,“LIKE”和“NOT LIKE”是非常重要的工具。它们为查询数据集提供了极大的灵活性,使你可以精确地检索所需的数据子集。通过遵循最佳实践并结合其他Eloquent方法,你可以构建出既安全又高效、表达力强的查询来应对甚至最复杂的搜索条件。
在我们结束这个教程时,记得您的查询对数据库性能的影响以及确保用户输入总是被安全处理的重要性。基于这些要点,现在您已经准备好使用Laravel的Eloquent ORM中的‘LIKE’和‘NOT LIKE’来充分利用它们。

长工码奴1523
在Laravel框架中,我们经常需要对数据库中的数据进行模糊搜索。这通常涉及到使用SQL的LIKE和NOT LIKE操作符。这两个关键字可以帮助我们在查询时添加通配符,使得匹配更加灵活。
示例
假设我们有一个名为users的表,其中包含一个名为name的字段。我们要查找名字为“John”或“Jane”的用户。
$users = User::where('name', 'LIKE', 'John%')
->orWhere('name', 'LIKE', '%Jane%')
->get();
在这个例子中,我们使用了两个WHERE子句来实现我们的目标。第一个子句'name', 'LIKE', 'John%'表示要查找所有名字以“John”开头的名字。第二个子句'%Jane%'则表示要查找所有名字以“Jane”结尾的名字。
使用NOT LIKE操作符
如果我们想要查找名字不以“John”或“Jane”开始或结束的用户,我们可以将条件改为:
$users = User::where('name', 'NOT LIKE', 'John%')
->where('name', 'NOT LIKE', '%Jane%')
->get();
说明
- LIKE操作符:这个操作符用于匹配字符串中的字符。它可以通过指定一个通配符(如
%)来扩展匹配范围。 - NOT LIKE操作符:与
LIKE操作符相反,它用来排除匹配。
这两种操作符的组合允许我们在处理复杂的查询时更有效地过滤数据。例如,如果你想要找出所有名字以字母“A”开头但不是以字母“I”结尾的用户,你可以这样编写查询:
$users = User::where('name', 'LIKE', 'A%')
->where('name', 'NOT LIKE', 'I%')
->get();
通过这种方式,你可以轻松地根据需求调整查询条件,提高代码的灵活性和效率。

