数据查询

简单数据查询:

多个条件
  1. $this->db()->get('user-id-1-name-abc', false); //id和name为or关系
  2. $this->db()->get('user-id-1-name-abc', true, true);//id和name为and关系。且在数据库主从读写分离时强制从主库读(适用于对实时要求高的时候主从架构强制读主库)
  3. $this->db()->get('user-id-1-name-abc', true, false, 'u_');//指定表前缀为u_。假定配置中配置的表前缀不为u_。这边可单独指定前缀
在这边要特殊说明 $this->db() 这边的db()方法,在配置文件章节中我们看到在normal.php中有配置项default_db这个配置,它是默认连接的数据库集群,如果我们的业务中有需要连接多个数据库集群呢? 这时只要在normal.php中添加相关的数据库配置项如
  1. 'default_db' => [
  2. 'driver' => 'MySql.Pdo', //数据库驱动
  3. 'master' => [
  4. 'host' => 'localhost', //数据库主机
  5. 'username' => 'root', //数据库用户名
  6. 'password' => '', //数据库密码
  7. 'dbname' => 'test', //数据库名
  8. 'charset' => 'utf8', //数据库编码
  9. 'tableprefix' => 'h_', //数据表前缀
  10. 'pconnect' => false, //是否开启数据库长连接
  11. 'engine' => ''//数据库引擎
  12. ],
  13. 'slaves' => [], //从库配置
  14. //查询数据缓存时间,表数据有变动会自动更新缓存。设置为0表示表数据没变动时缓存不过期。
  15. //这边设置为3600意思是即使表数据没变动也让缓存每30s失效一次,这样可以让缓存空间更合理的利用.
  16. //如果不想启用缓存直接配置为false
  17. ],
  18. 'game_db' => [
  19. 'driver' => 'MySql.Pdo', //数据库驱动 或者MongoDB.MongoDB使用MongoDB驱动
  20. 'master'=> [
  21. 'host' => 'localhost', //数据库主机
  22. 'username' => 'root', //数据库用户名
  23. 'password' =>'', //数据库密码
  24. 'dbname' => 'test', //数据库名
  25. 'charset' => 'utf8', //数据库编码
  26. 'pconnect' => false, //是否开启数据库长连接
  27. 'engine'=>''//数据库引擎
  28. ],
  29. 'slaves'=> [],
  30. //查询数据缓存时间,表数据有变动会自动更新缓存。设置为0表示表数据没变动时缓存不过期。
  31. //这边设置为3600意思是即使表数据没变动也让缓存每30s失效一次,这样可以让缓存空间更合理的利用.
  32. //如果不想启用缓存直接配置为false
  33. 'cache_expire' => 30,
  34. ],

然后在写查询语句的时候直接 $this->db('game_db')即可,不写则为调用default_db配置的数据库集群。当然了如果数据库配置是从其它渠道过来的比如从db来的,也可在调用db()方法时直接传入数组

复合查询

获取多行
  1. $this->db()->table('user')
  2. ->columns('id', 'name')
  3. ->where('id', 1)
  4. ->whereGt('id', 7)
  5. ->orderBy('id', 'desc')
  6. ->select(0, 10);
  7. //生成的语句 SELECT id, name FROM pre_user WHERE id = 1 AND id > 7 ORDER BY id DESC LIMIT 0, 10;
  8. ->where(['id' =>1, 'name'=>'name'], true)//where支持传数组生成`id`=1 AND`name`='name'
  9. ->where(['id' =>1, 'name'=>'name'], false)//where支持传数组生成`id`=1 OR `name`='name'
只获取一行
v2.7.2+可用
  1. $this->db()->table('user')
  2. ->getOne();
  3. //相当于select(0, 1) && return $result[0];
只获取第一行的某个字段
  1. $this->db()->table('user')
  2. ->where('id', 1)
  3. ->getOneValue('name');
获取某列值的列表
v2.7.3+可用
  1. $this->db()->table('user')
  2. ->whereGt('id', 1)
  3. ->plunk('name');
  4. //返回的数组为 ['name1', 'name2'...]
组块结果集
  1. $this->db()->table('user')
  2. ->whereGt('id', 10)
  3. ->chunk(100, function($users) {
  4. foreach ($users as $user) {
  5. // 处理结果集...
  6. }
  7. });
  8. //以100条数据为单位分批处理。假设共有1w条数据。则上面的匿名函数会被调用100次

你可以通过从闭包函数中返回false来终止组块的运行:

  1. $this->db()->table('user')
  2. ->whereGt('id', 10)
  3. ->chunk(100, function($users) {
  4. foreach ($users as $user) {
  5. // 处理结果集...
  6. return false;
  7. }
  8. });

连接

  1. $this->db('game_db')->table(array('user' => 'u'))
  2. ->join(array('group' => 'g'), 'u.gid = g.id')
  3. ->leftJoin(array('acl' => 'a'), 'a.uid = u.id')
  4. ->rightJoin(array('order' => '0'), 'o.uid = u.id')
  5. // 生成的语句 SELECT * FROM user as u INNER JOIN group AS g ON u.gid = g.id LEFT JOIN acl AS a ON a.uid = u.id RIGHT JOIN order AS o ON o.uid = u.id;

自动注入表名,表前缀

在上面的代码中。我们声明了要连接的dbgamedb。操作的表为apilog。表前缀为pre,执行$this->mapDbAndTable()相当于执行了$this->db($this->db)->table($this->table, $this->tablePrefix);。当一个model中有多个方法时mapDbAndTable可以有效减少代码量,同时将表名和特殊的表前缀声明为的属性便于后期修改。


原文: