ThinkPHP数据库操作——数据查询

一、单数据查询

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());
        
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43058685/article/details/112516204