网站首页 > 技术文章 正文
引言
本文接着laravel的功能讲解,说一说在模型中查询条件内,使用like这样的SQL关键字 进行子字符串匹配。并通过几个示例,和不同的实现方法,为大家展示laravel的灵活性。
学习时间
比如有一个模型,存储的是用户的订阅数据。现在根据传入的参数,要筛选出某个电子邮件关联的所有订阅记录, 或者根据用户姓名关键字关联的所有订阅记录,代码如下:
BookingDates::where('email', Input::get('email'))->orWhere('name', 'like', '%' . Input::get('name') . '%')->get();
上面代码生成的SQL大约是下面这样的:
select * from booking_dates where email='my@email.com' or name like '%John%'
这样的做法固然是可以的,但是我们知道包含 like 关键字的SQL语句是肯定命中不了数据库索引的。所以一般我们都要避免这种操作。 如果实在不行,在可读性上,我们可以尝试一下laravel提供的本地作用域功能, 在模型内,或者全局内创建一个查询方法。
public function scopeWhereLike($query, $column, $value)
{
return $query->where($column, 'like', '%'.$value.'%');
}
这个是组成and SQL语句的方式,当然还有or SQL语句。
public function scopeOrWhereLike($query, $column, $value)
{
return $query->orWhere($column, 'like', '%'.$value.'%');
}
这样上面的查询语句就可以改造成这样:
$result = BookingDates::whereLike('email', $email)->orWhereLike('name', $name)->get();
把查询语句单独拿出来封装为公用的方法,使程序更加简洁易用。
当然了,如果倾向于使用原生的SQL语句实现,在模型的查询方法上可以像下面这样写:
BookingDates::whereRaw('email = ? or name like ?', [$request->email,"%{$request->name}%"])->get();
特别注意的是laravel的参数绑定是使用问号的。
最后再说一个知识点,就是MySQL内置的关键字,除了like匹配之外,我们还可以使用内置字符串函数instr进行判断。 那么还是使用原生的查询方式,代码如下:
BookingDates::whereRaw('email = ? or instr(name, ?) > 0', [$request->email,"%{$request->name}%"])->get();
写在最后
本文讲的知识点比较小,就是手动组装MySQL的查询语句。我们应该尽量避免MySQL的字符串匹配和操作, 这一部分会给查询过程带来性能的损耗。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。
猜你喜欢
- 2024-09-14 Mysql:替换某个字段中的部分字符串——replace函数
- 2024-09-14 plsql字符串分割浅谈(plsql字符串截取)
- 2024-09-14 oracle函数--INSTR、SUBSTR使用说明和实例讲解
- 2024-09-14 详解Oracle使用substr和instr截取字符串指定位置的字符
- 2024-09-14 mysql 替换某一个字段中的字符串(mysql替换一个字符串的字符函数为)
- 2024-09-14 sql注入总结(sql注入示例)
- 2024-09-14 Mybatis 中的 DAO 接口和 XML 文件里的 SQL他们如何建立关系?
- 2024-09-14 SQL Server - 字符串常用操作(sqlserver 字符类型)
- 2024-09-14 如何在Java中比较字符串?(如何在java中比较字符串个数)
- 2024-09-14 SQL截取函数(substr)与字符串查找函数(Instr)的组合应用
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)