一、单数据查询
1.1 单数据查询
- Db:table() 中table的参数必须是完整的表名(包括前缀)
- 必须指定查询条件
use think\facade\Db;
class DataBaseTest
{
public function index()
{
// 单数据查询(查询一条数据)查询一条数据
// 使用find函数进行查找,必须指定where查询条件
// where需要两个参数 field 是表中的字段 op 是对应的值
$user = Db::table('tp_user')->where('id',27)->find();
return json($user);
}
}
1.2 输出生成的SQL语句
获取查询的SQL语句
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$user = Db::table('tp_user')->where('id',27)->find();
// 返回最后一次生成的SQL语句
$sql = Db::getLastSql();
return json($user);
}
}
1.3 返回空值或抛异常
当查询不到结果时,返回空值或者抛异常
use think\facade\Db;
class DataBaseTest
{
public function index()
{
// 当查询不到结果时,返回null
$user1 = Db::table('tp_user')->where('id',1)->findOrEmpty();
// 当查询不到结果是,则抛出一个异常
$user2 = Db::table('tp_user')->where('id',1)->findOrFail();
return json($user);
}
}
二、数据集查询
2.1 数据集查询
获取多列数据。
可以不指定查询条件。
use think\facade\Db;
class DataBaseTest
{
public function index()
{
// 可以不指定where条件
$user = Db::table('tp_user')->select();
return json($user);
}
}
2.2 查询不到数据时抛异常
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$user = Db::table('tp_user')->where('id',1111)->selectOrFail();
return json($user);
}
}
2.3 将数据集对象转成数组
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$user = Db::table('tp_user')->select()->toArray();
dump($user);
}
}
2.4 使用name方法,省略前缀
如果在数据库配置中,配置了表名前缀,那么我们可以省略掉前缀。如果使用name方法的时候,加了前缀,并且也配置了前缀信息。那么可能会出现报错
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$user = Db::name('user')->select()->toArray();
dump($user);
}
}
三、其他查询
3.1 value方法获取某个字段的值
使用Value方法可以获取某个字段的值(单个数据)。
value的参数是字段名。
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$username = Db::name('user')->where('id',27)->value('username');
dump($username);
}
}
3.2 column方法查询指定列的多个值。
column参数为指定字段的名
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$res = Db::name('user')->column('username');
return json($res);
}
}
指定id为索引
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$res = Db::name('user')->column('username','id');
return json($res);
}
}
3.3 使用chunk方法对数据分批处理
为了避免一次性读取太多数据占据内存,可以用chunk方法对数据进行分批处理。
- chunk方法第一个参数是每次处理多少数据,第二个参数传入一个闭包函数。函数的参数为结果数据集。
use think\facade\Db;
class DataBaseTest
{
public function index()
{
Db::name('user')->chunk(4,function ($users){
foreach ($users as $user) {
dump($user);
}
echo 'hello world';
});
}
}
3.4 使用游标cursor进行查询
利用游标查询功能,可以每次只读取一行。再读取时,可以自动定位到下一行。可以大大节省内存开销。
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$cursor = Db::table('tp_user')->cursor();
foreach($cursor as $user)
{
dump($user);
}
}
}
四、链式查询
4.1 查询规则
- 可以通过
->
连续多次调用查询方法,即为链式查询。 - 当 Db::name(‘user’)时,返回查询对象(Query),即可连缀数据库对应的方法。
- 每次执行数据库查询方法时,返回的也是一个查询对象(Query)。例如where()。
- 只要是数据库查询对象,则可以一直使用链式查询。
- 最后使用find()、select()方法返回数组或者数据集对象。
- 除了查询方法可以使用链式操作,CRUD操作也都可以。
4.2 重复查询
每次使用数据库查询的时候,都会生成一个实例,造成资源浪费。我们可以将对象实例保存下来。然后方复调用。
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$userQuery = Db::name('user');
$resFind = $userQuery->where('id',27)->find();
$resSelect = $userQuery->select();
}
}
但同一个对象实例第二次查询时,会保留上一次的值,可以使用removeOption()方法清理掉上一次查询保留的值
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$userQuery = Db::name('user');
$resFind = $userQuery->where('id',27)->find();
$resSelect = $userQuery->select();
echo Db::getLastSql();
echo '<br>';
return json($userQuery->removeOption('where')->select());
}
}