ThinkPHP查询数据与CURD
一、创建连接
在配置文件中使用如下配置:
//mysql 定义 /* 'db_type' => 'mysql', 'db_host' => 'localhost', 'db_user' => 'root', 'db_pwd' => '', 'db_port' => 3306, 'db_name' => 'test', */ //PDO专用定义 //PDO连接方式 'DB_TYPE' => 'mysql', // 数据库类型 'DB_USER' => 'root', // 用户名 'DB_PWD' => '', // 密码 'DB_PREFIX' => '', // 数据库表前缀 'DB_DSN' => 'mysql:host=localhost;dbname=test;charset=UTF8',
注意在ThinkPHP3.2.3,默认所有数据库都是基于PDO实现的,所以DB_TYPE不再支持PDO设置,必须采用实际的数据库类型设置。
*为了在调试时可以显示SQL语句,这里可以加上以下配置
//页面Trace 'SHOW_PAGE_TRACE' => true,
二、创建控制器并创建相应方法。
三、创建数据库连接类。一种是通过基类Model创建,一种是创建自定义模块。
通过基类Model创建:
//Model基类 $user = new Model(); $user = new Model("user"); $user = M();//等同于new Model(); $user = M("user");//等同于new Model("user") $user = new Model("user","","mysql://root:@localhost/test");//第一个参数为表名,第二个参数为表名前缀
通过自定义模块:
$user = new \Home\Model\UserModel(); $user = D("User");
*自定义模块时,若要使用不同的表,可在模块中定义以下属性:
//修改前缀 protected $tablePrefix = "tp_" //修改表名 protected $tableName = "abc"; //一起修改 protected $trueTableName = "tp_abc"; //修改数据库名 protected $dbName = "aaa";
四、查询数据
1、基本查询的三种方式:
//select全部显示,find显示一条 $user = M('User'); //-------字符串方式 var_dump($user->where('id=1 AND user="蜡笔小新"')->select()); //-------数组索引方式 默认是AND(高效) $condition['id'] = 2; $condition['username'] = 'llicat'; //改变AND为OR $condition['_logic'] = 'OR'; //-------对象条件查询 PHP内置类在根目录下找 '\' $condition = new \stdClass(); $condition->id = 1; $condition->username='admin'; $condition->_logic ='or'; var_dump($user->where($condition)->select());
2、表达式查询:eq,neq,gt等
$user = M('user'); $map['id']= array('eq','1,3');//eq,neq,gt,egt,lt...具体看手册 eq等于 等于1和2?再加一个数组的形式不能用 用逗号 !1,3 $map['username']=array('like','%l%');//notlike 不用空格 $map['username']=array('like',array('%l%','%a%'),'and');//最后一个参数不写默认是OR //区间查询 $map['id']=array('between','2,4'); $map['id']=array('between',array('1','3'));//或者这样 not between 需要空格 $map['id']=array('in','2,4');//array也行 not in空格 //EXP:自定义 $map['id'] = array('exp','=1 AND username="llicat"'); $map['id'] = array('exp','in (1,2,3)'); $map['username'] = array('exp','="123"'); $map['_logic']='OR'; var_dump($user->where($map)->select());
3、快捷查询:
$user = M('user'); $map['username|password'] = 'llicat';// 相同查询条件|:or &:and $map['username&password'] = array('llicat','123456','_multi'=>TRUE);//multi设置一一对应,不然username会对应多个 $map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);//和表大会组合 并且可以多个 var_dump($user->where($map)->select());
4、区间查询
$user = M('user'); $map['id'] = array(array('gt',1),array('lt',3));//用AND:不加第三个参数。 用OR:第三个参数 'OR' var_dump($user->where($map)->select());
5、组合查询(索引数组的扩展)
//字符串查询(_string) 复合查询(_complex) 请求字符串查询(_query) $user = M('user'); //-------------字符串查询扩展 $map['id'] = array('eq',1); $map['_string'] = 'username="llicat" AND password="123456"';//这种方式不太安全,生成的SQL语句中字段名没反单引号 $map['_logic'] = 'OR';//OR //-------------请求字符串查询扩展 $map['id'] = array('eq',1); $map['_query'] = 'username=llicat&password=123456';//有反单引号,较安全,推荐,也可以加_logic //-------------复合查询扩展 $map['id'] = array('eq',1); $where['id'] = 2; $map['_complex'] = $where; $map['_logic'] ='OR'; var_dump($user->where($map)->select());
6、统计查询:用于统计sum、avg、min、max、count等
var_dump($user->count());//括号里写'email'这种选择某个字段,如果该字段可为空,且有空,则不计算空 var_dump($user->min('id'));//sum、avg等等
7、动态查询
var_dump($user->getByUsername('llicat')); var_dump($user->getFieldByUsername('llicat',id));//根据username找相对应id
8、SQL查询:原生SQL查询,query读取,execute写入
var_dump($user->query('SELECT * FROM user'));//根据username找相对应id var_dump($user->execute("UPDATE user SET username='admin' WHERE id='2'"));//根据username找相对应id
9、连贯操作,更多操作可以查看ThinkPHP手册
$user = M('User'); var_dump($user->where('id>1')->order('id ASC')->limit(2)->select()); //用数组方式或者参数方式更好更安全 var_dump($user->select(array('where'=>array('id'=>array('neq',1)),'order'=>'id DESC,username DESC','limit'=>2)));//支持多字段排序 var_dump($user->field('id,username')->select());//只返回指定字段可以用于查询、写入//列名重命名需要as,且field中可以使用SQL函数,数组参数 //分页 limit\page var_dump($user->limit(0,2)->select());//从0开始显示前两等同于page(1,2) var_dump($user->page(2,2)->select());//每页显示俩,显示第二页,等同于limit(2,2) //alias表别名, group having,commentSQL语句注释,join默认内连接 A表 on B表 第二个参数'RIGHT'可以设置左右连接,union合并多个结果集 //distinct去重,cache(true)利用缓存
10、table方法:切换数据表、多表查询
var_dump($user->table('user')->select());//可以用简化表名"__USER__"简化表名不用带前缀,table需要带 var_dump($user->table('__DOC__')->select()); var_dump($user->field('a.id,a.neirong,b.id,b.username')->table('__DOC__ a,__USER__ b')->select());//列名重命名需要as var_dump($user->field('a.id,a.neirong,b.id,b.username')->table(array("user"=>b,"doc"=>a))->select());
11、命名范围
在模型中定义$_scope:
//SQL命名范围,必须写$_scope,有下划线:属性 //不设置default,默认是显示所有数据 protected $_scope = array( 'sql1'=>array( 'where'=>array('id'=>1), ), 'sql2'=>array( 'order'=>array('id'=>DESC), 'limit'=>2, ), 'default'=>array( 'where'=>array('id'=>2), ), );
在控制器中调用:
//$user = D("User"); //没下划线:方法 //scope支持多个调用 var_dump($user->scope('sql1')->scope('sql2')->select());//或者scope('sql1,sql2') var_dump($user->scope('sql2',array('limit'=>4))->select());//也可以不指定哪个sql,直接覆盖所有 var_dump($user->sql2()->select());//直接调用
五、create方法
#create创建数据对象,并没有添加数据或者添加表,结果就是提交过来的键值对 #创建完成后的数据可以直接读取或者修改利用$user->username #保存在内存中,并没有实际写入到数据库中,直到使用add 或者save 方法才会真正写入数据库。 $user = M('User'); //--------直接create空,显示提交过来表单的数据,且默认为POST,接收get,create($_GET)但是create只获取数据库表与表单对应的信息,POST获取所有 var_dump($user->create()); //--------数据覆盖 $data['username']='llicat'; $data['password']='123456'; var_dump($user->create($data)); //--------直接用_POST接收 $data['username']=$_POST['username']; $data['password']=$_POST['password']; $data['date']=date('Y-md H:i:s'); var_dump($user->create($data)); //--------手工获取数据,从对象创建新的数据对象 $data = new \stdClass(); $data->username = $_POST['username']; $data->password = $_POST['password']; $data->date = date('Y-md H:i:s'); var_dump($user->create($data)); //--------create俩个参数,第一个参数必须制定POST或者GET,第二个为操作,insert或者update //没指定第二个参数时,根据数据源是否包含主键判断修改或者新增,类似merge into var_dump($user->create($_GET)); var_dump($user->create($_POST, \Think\Model::MODEL_INSERT)); //--------支持连贯操作field过滤、validate数据自动验证、auto数据自动完成、token令牌验证,与域有关 //限制字段 var_dump($user->field('username')->create());//只显示username //在模型中限制 $user = D('User'); var_dump($user->create());
限制字段,需要在模型中限制时,可以在模型中设置如下属性:
//限制create protected $insertFields = 'user'; protected $updateFields = 'user';
六、数据写入,add
//=================================数据写入================================= $user = M('User'); $data['username']='heiheihei'; $data['password']='xixixi'; $user->add($data); //----------------------结合create $user = M("User"); //接收表单数据+创建的数据 $data = $user->create(); $data['date']=date('Y-m-d H:i:s'); $user->add($data); //----------------------连贯操作data,可以用于写入多个对象 $user->data($data)->add(); //或者可以用url格式 $data ='username=heiheihei&password=xixixi'; $user->data($data)->add();
七、数据查询,select
$user=M('user'); //显示所有 var_dump($user->select()); //显示第一条 var_dump($user->find()); //得到指定字段,且只显示一个 var_dump($user->getField('username')); //显示该字段的所有,不只显示一个 var_dump($user->getField('username',true)); //显示多个字段,直接会显示所有,重复的会被屏蔽! var_dump($user->getField('username,password')); //指定分割符号,第二个参数 var_dump($user->getField('id,username,password',':')); //限制limit 第二个参数 var_dump($user->getField('id,username,password',2));
八、更新数据,save
$user=M('user'); $data['username'] = 'oooooooooooo'; $data['password'] = 'xxxxxxxxxxxx'; $map['id']=4; $user->where($map)->save($data); //默认主键为条件 $data['id']=5; $data['username'] = 'tttttt'; $data['password'] = 'qqqqqq'; $user->save($data); //结合create,id也表单传过来时 $user->create(); $user->save();//返回值0:没修改,1:返回成功 //修改某一个字段值 $map['id']=1; $user->where($map)->setField('username','heihei'); //统计累加累减 count是一个为int的字段名 $map['id']=1; $user->where($map)->setInc('count',1);//累加 $user->where($map)->setDec('count',1);//累减
九、删除数据,delete
$user=M('user'); //默认根据主键删除 $user->delete(6); //---------- $map['id']=6; $user->where($map)->delete(); //批量删除多个,根据主键要加引号 $user->delete('1,2,3'); //删除多个条件的 $map['count']=0; $user->where($map)->order(array('id'=>'DESC'))->limit(1)->delete(); //删除所有数据,谨慎 1或者true?回头可以试试 echo $user->where('1')->delete();//成功返回1 ,没删返回0
十、ActiveRecord模式,对象化的操作方式
$user=M('user'); //---------------添加 $user->username = 'llicat'; $user->password ='xixixi'; $user->add(); //结合create 处理表达 $user->create(); $user->date =date('Y-md H:i:s'); $user->add(); //----------------查找 //find找到主键为4的值 var_dump($user->find(4)); //找到username=llicat的记录 var_dump($user->getByUsername('llicat')); //输出 $user->getByUsername('llicat'); echo $user->username; //通过主键查询多个 var_dump($user->select('1,2,3')); //-----------------修改 //产生了两条sql,第一条找到数据,第二条修改,且元数据都取出了,效率不高 $user->find(1); $user->username='xingxing'; $user->save(); //-----------------删除 //产生两条sql $user->find(5); $user->delete(); //根据主键 $user->delete('1,2');
十一、字段映射:表单名和数据库的字段名不对称,用create不能直接获取,需要用模块做处理
模块中:
//字段映射 protected $_map = array( 'yonghuming'=>'username', 'mima'=>'password', );
控制器中:
//需要用模块处理 $user = D('user'); var_dump($user->create());
by llicat
##转载请注明出处http://www.cnblogs.com/llicat/