连接数据库

在config.php中配置数据库信息

  1. return array(
  2. //'配置项' => '配置值'
  3. //数据库类型
  4. 'DB_TYPE' =>'mysql';
  5. //服務器地址
  6. 'DB_HOST' => 'localhost,localhost1,localhost2',
  7. //数据库名
  8. 'DB_NAME' => 'test',
  9. //用户名
  10. 'DB_USER' => 'root',
  11. //密码
  12. 'DB_PWD' => '',
  13. //端口
  14. 'DB_PORT' => '3306',
  15. //数据库表前缀
  16. 'DB_PREFIX' =>'',
  17. //数据库连接参数
  18. 'DB_PARAMS' => array(),
  19. //数据库调试模式,开启后可以记录SQL日志
  20. 'DB_DEBUG' => TRUE,
  21. //数据库读写是否分离,主从式有效
  22. 'DB_RW_SEPARATE' => false,
  23. //读写分离后,主服务器数量
  24. 'DB_MASTER_NUM' => 1,
  25. //启用字段缓存
  26. 'DB_FIELDS_CACHE' => TRUE,
  27. //数据库编码,默认采用utf8
  28. 'DB_CHARSET' => 'utf8',
  29. //页面调试
  30. 'SHOW_PAGE_TRACE' => true,
  31. //开启日志记录
  32. 'LOG_RECORD' => true,
  33. //只记录EMERG,ALERT,CRIT,ERR 错误
  34. 'LOG_LEVEL' => 'EMERG,ALERT,CRIT,ERR,SQL,VOTICE',
  35. //显示错误信息
  36. 'SHOW_ERROR_MSG' => true,
  37. );

ThinkPHP支持数据库的读写分离,如果要开启:

  1. DB_RW_SEPARATE设为TRUE
  2. DB_HOST多个数据库使用逗号隔开,主服务器要排在前面
  3. DB_MASTER_NUM配置主服务器的数量

    实例化模型

    实例化基础模型

    现有一张表user,可以使用new Model或M方法来实现实例化模型,并查询数据
    1. $user = new Model('user');//参数为表名
    2. //$user=M('user');
    3. $data = $user -> select();
    4. dump($data);

    实例化自定义模型

    也可以自定义一张UserModel
    1. namespace Home\Model;
    2. use Think\Model
    3. class UserModel extends Model{
    4. }
    1. $user = new \Home\Model\UserModel();
    2. $data = $user -> select();
    在自定义UserModel的时候,ThinkPHP会自动将其和user表对应上。
    如果你希望自己定义model和表的对应关系,可以使用以下属性:
属性名 作用
tablePrefix 定义模型对应书库表的前缀,如果未定义则获取配置文件中的DB_PREFIX参数
tableName 不包含表前缀的数据表名称,一般情况下默认和模型名称相同,只有当你的表名和当前的模型类的名称不同的时候才需要定义。
trueTableName 包含前缀的数据表名称,也就是数据库中的实际表中,该名称无需设置,只有当上面的规则都不适用的情况或者特殊情况下才需要设置。
dbName 定义模型当前对应的数据库名称,之后当你当前的模型类对应的数据库名称和配置文件不同的时才需要定义。

例如:

  1. namespace Home\Model;
  2. use Think\Model;
  3. class UserModel extends Model{
  4. protected $userTableName = 'myuser';//一定要加上protected关键字
  5. }

也可以使用D方法来实例化

  1. $User = D('User');//相当于 $User = new \Home\Model\UserModel();

使用D方法可以自动从\Home\Model中寻找模型

实例化空模型

  1. //实例化空模型
  2. $Model =new Model();
  3. //或者使用M快捷方法是等效的
  4. $Model =M();
  5. //进行原始的SQL查询,用于select语句
  6. $data = $Model -> query('SELECT * FROM myuser');
  7. //进行update,insert,delete语句
  8. $data = $Model -> execute('delete from myuser where id =1');

注意:如果在Linux环境下面,一定要注意D方法实例化的时候的模型名称的大小写

增删改查

add

  1. $data = array(
  2. 'name'=>'px',
  3. 'age'=>22
  4. );
  5. $result = D('user')->add($data);
  6. dump($result);

add方法返回参数是插入的数据的id

插入多条数据

  1. $data= array(
  2. 0=>array(
  3. 'name'=>'px',
  4. 'age' => 22
  5. ),
  6. 1=> array(
  7. 'name' => '1x',
  8. 'age' => 25
  9. ),
  10. 2=> array(
  11. 'name' =>'2x',
  12. 'age' => 23
  13. )
  14. );
  15. $result = D('user') => addAll($data);

返回数据是插入的数据的第一条的id
注意:addAll方法只支持mysql数据库

select

例1:字符串用法

  1. $result=D('user') -> where('id=4 or age=6') -> select();

例2:

  1. $where['id']=4;
  2. $where['age']=6;
  3. $where['_logic'] = 'or';//_logi默认为and
  4. $result =D('user') -> where($where) -> select();//等同于select * from user where id=4 or age = 6;

例3:表达式查询

  1. //表达式查询,支持eq,nep,lt,elt,gt,ngt,in,not,in,between等
  2. //$where['id'] = array('lt',6);//表示id 小于 6
  3. $where= array('between','4,6');//表示id在4-6之间
  4. $result=D('user') -> where($where) -> select();

例4:模糊查询

  1. //$where['name'] = array('like','%ja%');
  2. $where['name'] = array('like',array('%ja%','%e%'));//两个like之间是使用or关联
  3. $result = D('user')->where($where)->select();

例5:

  1. $where['id']=> array(array('lt',5),array('gt',2));
  2. $result = D('user')->where($where)->select();

例6:

  1. $where['id']= array(array('lt',5),array('gt'),10,'or');

例7:(不推荐使用这种混合的方式)

  1. $where['id'] = array('lt',6);
  2. $where['_string'] = 'age < 10';
  3. $result = D('user')->where($where)->select();

例8:统计用法(count,sum,min,avg等)

  1. $result = D('user')->count(); //统计条数
  2. $result = D('user')->max('id');//获取id最大值
  3. $result = D('user')->avg('id');//获取平均值

update

  1. $update['name'] = 'mike';
  2. $where['id'] = 5;
  3. $result = D('user')->where($where)->save($update);
  1. $update['name'] = 'mike';
  2. $where['id'] = array('lt',6);
  3. $result = D('user')->where($where)->save($update);

delete

  1. $where['id'] =6;
  2. $result = D('user')->where($where)->delete();
  3. //或者
  4. $result= D('user')->delete(5);//直接传入主键

order排序

  1. $result= D('user')->order('id desc') -> select();//多个条件用逗号隔开

field字段选择

  1. $result=D('user') ->field('id,name')->select();//只查询id和name字段
  2. $result=D('user')->field('id,name',true)->select();//true表示查询除了id和name以外的字段

limit

  1. $result=D('user')->limit(3,4)->select();//第三条开始,共查询4条数据

page分页

  1. $result=D('user')->page(2,5)->select();//page(页码,每页条数),每页数条默认为20

group和having

  1. $result=D('user')->field('age,count(*) as total')->group('age')->having('age>10')->select();

多表查询

table方法(不常用)

table(array(表名=>表别名))

  1. $result=M()->table(array('myuser'=>'user','user_info'=>'info'))->where('user.id=info.userId')->select();

注意:此处表名要写完整表名

join方法

  1. $result=D('user')->join('user_info on user.id=user_info.userId')->select();

可以使用right join,left join等关键字配置关联的方式

  1. $result=D('user')->join('left outer join user_info on myuser.id=user_info.userId')->select();

如果要关联多个表,可以多次使用join()方法

  1. $result=D('user')->join('left outer join user_info on myuser.id=user_info.userId')->join('xxxxx')->select();

union查询

union(‘string|array’,true/false);第二个参数是是否使用union all,默认为false

  1. $result=D('user')->union('select *from user2')->select();

注意:union查询的两个表之间必须字段一样

distinct

  1. $result=D('user')->distinct(true)->field('age')->select();

命名范围

什么是命名范围?

命名范围就是上述的一些数据库操作进行一些封装,方便调用,例如:
对UserModel进行一些封装

  1. namespace Home\Model;
  2. use Think\Model;
  3. class UserModel extends Model{
  4. protected $_scope =array(
  5. "scope1" => array(
  6. 'where' => array('id' => array('gt',5)),
  7. 'feild' => 'id,name'
  8. ),
  9. "scope2" => array(
  10. 'field' => 'name.age'
  11. ),
  12. );
  13. }

然后调用

  1. $result=D('user')->scope('scope1')->select();
  2. //如果同时调用多个命名范围,使用逗号隔开
  3. $result=D('user')->scope('scope1,scope2')->select();
  4. //如果多个命名范围中有冲突,那么后面的会覆盖前面的