在thinkPHP中数据的查询主要有以下三种方法:
先给出一个实际的例子。
$data = Db::table('user')->where('age', 28)->find();
Db::table('user')->where('age', 28)->find();
$data = Db::getLastSql();
$data = Db::table('user')->where('age', 1)->findOrEmpty();
$data = Db::table('user')->where('age', 1)->findOrFail();
Line 1,如果只希望查询一条数据,使用find()方法,同时指定where条件。(不指定where将返回空值);
Line 2, 3,使用getLastSql()方法可以返回最近的一条sql原生语句;
Line4,设置在没有获取到数据时返回空值;
Line5,设置在没有获取到数据时抛出异常。
语法格式:where('字段名','查询表达式','查询条件');
默认是“=”,使用<>、>、<、>=、<=可以筛选出各种符合比较值的数据列表。
Db::name('user')->where('id','<>',80)->select();
1、使用 like表达式进行模糊查询;
// %可以匹配多个字符
Db::name('user')->where('email','like','xiao%')->select();
2、 like表达式还可以支持数组传递进行模糊查询;
Db::name('user')->where('email','like',['xiao%','wu%'], 'or')->select();
SELECT * FROM `tp_user` WHERE (`email` LIKE 'xiao%' OR `email` LIKE 'wu%')
3、like表达式具有两个快捷方式 whereLike()和 whereNoLike();
Db::name('user')->whereLike('email','xiao%')->select();
Db::name('user')->whereNotLike('email','xiao%')->select();
4、between表达式具有两个快捷方式 whereBetween()和 whereNotBetween();
Db::name('user')->where('id','between','19,25')->select();
Db::name('user')->where('id','between',[19, 25])->select();
Db::name('user')->whereBetween('id','19,25')->select();
Db::name('user')->whereNotBetween('id','19,25')->select();
5、in表达式具有两个快捷方式 whereIn()和 whereNotIn();
Db::name('user')->where('id','in', '19,21,29')->select();
Db::name('user')->where('id','in', [19, 21, 29])->select();
Db::name('user')->whereIn('id','19,21,29')->select();
Db::name('user')->whereNotIn('id','19,21,29')->select();
6、null表达式具有两个快捷方式 whereNull()和 whereNotNull();
Db::name('user')->where('uid','null')->select();
Db::name('user')->where('uid','not null')->select();
Db::name('user')->whereNull('uid')->select();
Db::name('user')->whereNotNull('uid')->select();
使用 exp可以自定义字段后的 SQL语句;
Db::name('user')->where('id','exp','IN (19,21,25)')->select();
Db::name('user')->whereExp('id','IN (19,21,25)')->select();
这里同样给出实际的例子。
$data = Db::table('user')->select();
$data = Db::table('user')->select()->toArray();
dump($data);
$data = Db::table('user')->where('age', '-1')->selectOrFail();
$data = Db::name('user')->select();
Line 1,获取多列的数据通常使用select()方法;
Line 2, 3,由于line 1返回的数据类型为集合(collection),在使用line 3的方法对数据进行输出时,则需要使用toArray()方法来对数据进行转换;
Line 4,select()方法默认为在没有数据时返回空值,使用selectOrFail()在没有获取到数据时抛出异常;
Line 5,在app\comfig\database.php中进行设置省略前缀后,需要使用name()方法来忽略前缀。
这里同样给出相同的例子。
$data = Db::table('user')->where('age', 28)->value('name');
$data = Db::table('user')->column('name');
$data = Db::table('user')->column('name', 'age');
Db::table('user')->chunk(3, function ($users){
foreach ($users as $user){
dump($user);
}
echo '==========';
});
$cur = Db::table('user')->cursor();
foreach ($cur as $user){
dump($user);
}
Line 1,通过 value()方法,可以查询指定字段的值(单个),没有数据返回 null;
Line 2,通过 colunm()方法,可以查询指定列的值(多个),没有数据返回空数组;
Line 3,可以指定age作为列值的索引;
Line4,如果处理的数据量巨大,成百上千那种,一次性读取有可能会导致内存开销过大;为了避免内存处理太多数据出错,可以使用 chunk()方法分批处理数据;比如,每次只处理 100条,处理完毕后,再读取 100条继续处理;
Line10,可以利用游标查询功能,可以大幅度减少海量数据的内存开销,它利用了 PHP生 成器特性。每次查询只读一行,然后再读取时,自动定位到下一行继续读取;
当 Db::table('user')时,返回查询对象(Query),即可连缀数据库对应的方法;而每次执行一个数据库查询方法时,比如 where(),还将返回查询对象(Query);只要还是数据库对象,那么就可以一直使用指向符号进行链式查询;再利用 find()、select()等方法返回数组(Array)或数据集对象(Colletion);而find()和select()是结果查询方法(放在最后),并不是链式查询方法。查询对象具体的字段如下图所示(展开的是和查询有关的字段):
这里有几点需要注意的地方:
1、如果多次使用数据库查询,那么每次静态创建都会生成一个实例,造成浪费;我们可以把对象实例保存下来,再进行反复调用即可;
$data_query = Db::table('user');
$result1 = $data_query->order('age', 'asc')->select();
$result2 = $data_query->select();
2、再继续进行链式查询时,由于不会对之前的字段进行覆盖,所以在某些情况下需要手动对之前的字段进行清空!
$userQuery->removeOption('where')->select();
新增主要是使用insert()方法,参数为键值对的数组,示例如下:
public function insert(){
$data = [
'username' => '辉夜',
'password' => '123',
'gender' => '女',
'email' => '[email protected]',
'price' => 90,
'details' => '123'
];
return Db::name('user')->insert($data);
}
需要注意以下几点问题:
1、如果新增成功,insert()方法会返回一个1值;
2、如果你添加一个不存在的字段数据,会抛出一个异常 Exception;如果想强行新增抛弃不存在的字段数据,则使用 strick(false)方法,忽略异常;
Db::name('user')->strict(false)->insert($data);
3、如果我们采用的数据库是 mysql,可以支持 replace写入;insert和replace写入的区别,前者表示表中存在主键相同则报错,后者则修改;
Db::name('user')->replace()->insert($data);
4、使用 insertGetId()方法,可以在新增成功后返回当前数据ID;
Db::name('user')->insert($data);
return Db::name('user')->insertGetId($data);
批量新增比较简单,使用 insertAll()方法,可以批量新增数据,但要保持数组结构一致;
$data = [
[
'username' => '辉夜',
'password' => '123',
'gender' => '女',
'email' => '[email protected]',
'price' => 90,
'details' => '123'
],
[
'username' => '辉夜',
'password' => '123',
'gender' => '女',
'email' => '[email protected]',
'price' => 90,
'details' => '123',
]
];
Db::name('user')->insertAll($data);
批量新增也支持 replace()方法,添加后改变成replace into;在新增中,需要注意,save()方法是一个通用新增方法,它可以自行判断是新增还是修改(更新)数据;依据为是否存在主键,不存在即新增;
Db::name('user')->save($data);
基本操作,代码演示
$data = [
'username' => '李白'
];
return Db::name('user')->where('id', 301)->update($data);
注意以下几点:
1、如果$data字段中还有主键信息(id),那么可以省略where条件;
2、如果想让一些字段修改时执行 SQL函数操作,可以使用 exp()方法实现:
Db::name('user')->where('id', 232)
->exp('email', 'UPPER(email)')
->update();
3、如果要自增/自减某个字段,可以使用 inc/dec方法,并支持自定义步长(默认自增1):
Db::name('user')->where('id', 303)
->inc('details')
->update($data);
4、使用raw()实现2、3点的内容:
$data = [
'username' => '鲁班',
'email' => Db::raw('UPPER(email)'),
'price' => Db::raw('price + 1'),
'status' => Db::raw('status - 2')
];
return Db::name('user')->where('id', 304)
->update($data);
5、使用save()方法可以修改数据,但是必须指定主键:
Db::name('user')->where('id', 232)
->save(['username'=>'李黑']);
基本操作,代码演示。
Db::name('user')->where('id', 309)->delete();
Db::name('user')->delete(308);
注意以下几点:
1、根据主键,还可以删除多条记录
Db::name('user')->delete([48,49,50]);
2、通过 true参数删除数据表所有数据
Db::name('user')->delete(true);