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);
}
}
获取查询的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);
}
}
当查询不到结果时,返回空值或者抛异常
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);
}
}
获取多列数据。
可以不指定查询条件。
use think\facade\Db;
class DataBaseTest
{
public function index()
{
// 可以不指定where条件
$user = Db::table('tp_user')->select();
return json($user);
}
}
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$user = Db::table('tp_user')->where('id',1111)->selectOrFail();
return json($user);
}
}
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$user = Db::table('tp_user')->select()->toArray();
dump($user);
}
}
如果在数据库配置中,配置了表名前缀,那么我们可以省略掉前缀。如果使用name方法的时候,加了前缀,并且也配置了前缀信息。那么可能会出现报错
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$user = Db::name('user')->select()->toArray();
dump($user);
}
}
使用Value方法可以获取某个字段的值(单个数据)。
value的参数是字段名。
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$username = Db::name('user')->where('id',27)->value('username');
dump($username);
}
}
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);
}
}
为了避免一次性读取太多数据占据内存,可以用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';
});
}
}
利用游标查询功能,可以每次只读取一行。再读取时,可以自动定位到下一行。可以大大节省内存开销。
use think\facade\Db;
class DataBaseTest
{
public function index()
{
$cursor = Db::table('tp_user')->cursor();
foreach($cursor as $user)
{
dump($user);
}
}
}
->
连续多次调用查询方法,即为链式查询。每次使用数据库查询的时候,都会生成一个实例,造成资源浪费。我们可以将对象实例保存下来。然后方复调用。
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 '
';
return json($userQuery->removeOption('where')->select());
}
}