6月16 ThinkPHP连接数据库及Model数据模型层--------查询及数据添加
连接数据库配置及Model数据模型层
convertion.php
config.php
1.在config.php做数据库连接配置
2.修改配置
/* 数据库设置 */ 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'localhost', // 服务器地址 'DB_NAME' => 'mydb', // 数据库名 'DB_USER' => 'root', // 用户名 'DB_PWD' => '', // 密码 'DB_PORT' => '', // 端口 'DB_PREFIX' => '', // 数据库表前缀 'DB_PARAMS' => array(), // 数据库连接参数 'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志 'DB_FIELDS_CACHE' => true, // 启用字段缓存 'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8 'DB_DEPLOY_TYPE' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'DB_RW_SEPARATE' => false, // 数据库读写是否分离 主从式有效 'DB_MASTER_NUM' => 1, // 读写分离后 主服务器数量 'DB_SLAVE_NO' => '', // 指定从服务器序号
Model:数据库中每张表对应一个模型,Model是一个类,类名是表名,类里面的成员变量是列名,把一张表对应为一个类,其中一条数据对应一个对象
如果我们对该表的模型没有特殊操作的话可以不用建立该模型(换句话说就是不需要再Model里面新建形如InfoModel.class.php的模型)
1.实例化Model的三种方式:(以car表为例)
1.1 采用new的方式,需要新建模型 $car = new 命名空间CarModel();
CarModel.class.php
<?php namespace Admin\Model; use Think\Model; class CarModel extends Model { }
实例化MODEL类
$car = new \Admin\Model\CarModel();//根命名空间Admin
var_dump($car);//要求创建模型文件(子类对象里面的)
1.2 $car = D(‘模型标志’);
a) $car= D("car");
b) 该$goods是父类Model的对象,但是操作的数据表还是sw_goods
c) $obj = D(); 实例化Model对象,没有具体操作数据表,与M()方法效果一致
快捷的D方法
$car = D("car");
var_dump($car);
1.3 $car = M("模型标志");
a) 实例化父类Model
b) 可以直接调用父类Model里边的属性,获得数据库相关操作
c) 自定义model就是一个空壳,没有必要实例化自定义model
d) $obj = M(‘数据表标志’); 实例化Model对象,实际操作具体的数据表
$obj = D(标志);
$obj = D();
$obj = M(标志);
$obj = M();
D()和M()方法的区别:
前者是tp3.1.3里边对new操作的简化方法;
后者在使用就是实例化Model父类
两者都在函数库文件定义ThinkPHP/Common/functions.php
快捷的M方法
$car = M("car");
var_dump($car);
注意:如果没有对应的model模型文件类,也可以直接实例化model对象进行操作
D()和M()方法都可以实例化操作一个没有具体model模型类文件的数据表。
public function ShowAll() { //Model:数据库中每张表对应一个模型,模型其实就是一个类 //模型是类 //类名是表名,类里面的成员变量是列名 //把一张表对应为一个类,其中一条数据对应一个对象 //如果我们对该表的模型没有特殊操作的话可以不用建立该模型 //查询car表(模型没有建立),,new时必须要建立模型 //实例化MODEL类 //$car = new \Admin\Model\CarModel();//根命名空间Admin //var_dump($car);//要求创建模型文件(子类对象里面的) //快捷的D方法 //$car = D("car"); //var_dump($car); //快捷的M方法 //$car = M("car"); //var_dump($car); }
2. 数据查询
select()是数据模型的一个指定方法,可以获得数据表的数据信息
返回一个二维数组信息,当前数据表的全部数据信息
$obj = D(); 创建对象
$obj -> select(); 查询数据
select 字段,字段 from 表名 where 条件 group 字段 having 条件 order 排序 limit 限制条数;
查询常使用的方法:
$obj ->field(字段,字段); 查询指定字段
$obj ->table(数据表); 设置具体操作数据表
$obj ->where(参数); 参数就是正常sql语句where后边的条件信息
例如:( “goods_price >100 and goods_name like ‘三%’”)
$obj ->group(字段); 根据字段进行分组查询
$obj ->having(参数条件); having 条件设置
$obj ->order(‘price desc/asc’) 排序查询
$obj ->limit([偏移量,]条数) 限制查询的条数
$obj -> page() 分页类Page可以自动计算出每个分页的limit参数
例如:$obj->page("1,10")->select(); // 查询第一页数据
$obj->page("2,10")->select(); // 查询第二页数据
$obj ->find():如果我们查询的结果只有一个信息,为了使用方便我们会希望返回一个一维数组,这时候可使用find()方法
相关聚合函数: count() sum() avg() max() min()
以上聚合函数是最后被调用的方法
以上方法可以结合具体条件方法使用
例如:$goods -> where(‘goods_price >1000’)->count(); 大于1000元的商品的总数目
连贯操作返回是对象,而select是不可以的要写在最后面
老师讲课内容:
public function ShowAll() { $info = M("Info"); //返回所有数据二维数组 var_dump($info->select());//把数据库里面的都变成小写的,以后都要小写这样会好 //根据某些条件的查询 //$attr = $info->where("nation='n002'")->select();//where方法可以添加查询条件 //$attr = $info->table("car")->select();//table操作可以切换操作表 //$attr = $info->field("name,nation")->select();//field可以指定查询的字段,指定查询 //$attr = $info->order("birthday desc,sex asc")->select();//排序 //分页查询,如果1个参数时是取前n条数据,2个时是跳过多少取多少 //$attr = $info->limit(2,3)->select();//需要计算 //取第n页的m条数据 //$attr = $info->page(1,2)->select(); //分组查询 //$attr = $info->field("nation,count(*)")->group("nation")->select(); //select * from Info join Nation on 条件 select * from info join nation on info.Nation = nation.Code //连接查询没有记下 //$attr = $info->join("nation on info.Nation = nation.Code")->select(); //$attr = $car->join("Brand on Car.Brand = Brand.Brand_Code")->select();//连接查询 //$attr = $info->distinct(true)->field('nation')->select(); //$attr = $info->find('p001');//可以查一条数据,根据主键值,不写主键值时默认返回第一条 //$attr = $info->select('p001,p002');//根据主键值查询,返回二维数组,可以查询多条 //var_dump($attr); //聚合函数(求和,平均,最大,最小,总数) //$attr = $info->count(); //$attr = $info->min("birthday"); //$car = M("car");//快捷方法不需要建立模型 //var_dump($car); //$attr = $car->where("Name like '%奥迪%'")->order("Powers desc")->select(); //var_dump($attr);
}
自己在Admin模块下的练习:以car表为例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
$car = M("car"); //$attr = $car->select();//返回关联的二维数组,把数据库里面的都变成小写的,以后都要小写这样会好,但是添加数据要求完全一致 //根据某些条件的查询(where连贯操作返回是对象,而select是不可以的要写在最后面) //$attr = $car->where("brand='b002'")->select();//where方法可以添加查询条件 //table操作可以切换操作表 //$attr = $car->table("Nation")->select(); //field可以指定查询的字段,指定查询 //$attr = $car->field("name,code")->select(); //order排序 //$attr = $car->order("oil desc, powers asc")->select(); //分页查询,如果1个参数时是取前n条数据,2个时是跳过多少取多少 //$attr = $car->limit(2,2)->select(); //取第n页的m条数据 //$attr = $car->page(3,5)->select(); //group分组查询 //$attr = $car->field("brand,count(*)")->group("brand")->select(); //select * from Info join Nation on 条件 //select * from info join nation on info.Nation = nation.Code //join连接查询 //$attr = $car->join("brand on car.brand = brand.brand_code")->select(); //distinct去重 //$attr = $car->distinct(true)->field("brand")->select(); //find方法,根据主键可以取一条数据 //$attr = $car->find("c001");//一维数组 //$attr = $car->select("c001,c002");//二维数组 //模糊查询 //$attr = $car->where("name like '%奥迪%'")->order("powers desc")->select(); //聚合函数 //$attr = $car->count();//查询总条数 $attr = $car->max("price"); $attr = $car->min("price"); $attr = $car->sum("price"); $attr = $car->avg("price"); var_dump($attr);
模糊查询注册变量前端显示
//注册数组前端显示 $car = M("car"); $attr = $car->where("name like '%奥迪%'")->order("powers desc")->select(); //$attr = $car->select(); $this->assign("shuzu",$attr); $this->display();
前端代码:Admin\view\Main\ShowAll.html
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <h1>汽车表</h1> <table width="100%" border="1" cellpadding="0" cellspacing="0"> <tr> <td>代号</td> <td>名称</td> <td>系列</td> <td>油耗</td> <td>功率</td> </tr> <foreach name="shuzu" item="v"> <tr> <td><{$v.code}></td> <td><{$v.name}></td> <td><{$v.brand}></td> <td><{$v.oil}></td> <td><{$v.powers}></td> </tr> </foreach> </table> </body> </html>
显示效果:
3. 数据添加
add()该方法返回被添加的新记录的主键id值
两种方式实现数据添加
3.1 数组方式数据添加
$goods = D(“Goods”);
$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);
//注意:goods_name和goods_weight是数据表中字段名称
$goods -> add($arr);
function Add() { //$model = D("Info"); //要添加的数组,必须是关联数组,要求严格按照数据库的大小写写入,key必须为字段名称 $attr = array( 'Code'=>'a001', 'Name'=>'不知道', 'Sex'=>true, 'Nation'=>'n002', 'Birthday'=>'1998-2-3' ); //赋值方法添加 $attr["Code"]="a002"; $attr["Name"]="不是"; $attr["Sex"]=false; $attr["Nation"]="n003"; $attr["Birthday"]="2003-4-2"; //$model->add($attr);//添加数据的方法需要参数(该参数是一个关联数组) }
3.2 AR方式实现数据添加
a) ActiveRecord 活跃记录
b) AR规定了程序与数据库之间的关系
c) 什么是AR:
d) ①一个数据表对应一个类model
e) ②一条数据记录对应类的一个对象
f) ③每个字段对应该对象的具体属性
g) tp框架的AR是假的
$goods = D(“Goods”);
$goods -> goods_name = “htc_one”;
$goods -> goods_price = 3000;
$goods -> add();
以上两种方式:数组、AR,最后add都要把新记录的主键id值返回
//二:AR方法 //1.连接类 2实体类 3数据访问类 $model->Code = "a003"; $model->Name = "获奖"; $model->Sex = true; $model->Nation = "n002"; $model->Birthday = "1992-3-4"; $model->add();
3.3 收集表单数据入库操作
- 制作一个表单
- 通过$_POST收集信息
- 通过create()方法实现数据收集,该方法对于非法的字段会自动进行过滤
注意:一个add控制器实现两个逻辑,一个是打出添加页面,一个是向数据库添加内容
例子:Home\MainController\ShowAll
//三 自动收集表单 $nation = M("nation"); $attr = $nation->select(); //var_dump($attr); $this->assign("shuzu",$attr); //$this->display(); if(empty($_POST)) { $this->display(); } else { $model = D("Info"); $model->create();//自动收集表单并且创建数据 $model->Sex = $_POST["Sex"]=="男"?true:false; //$model->add(); $z = $model->add(); //var_dump($z);//输出结果是int 1 if($z) { $this->success("添加成功!","Add",5); } else { $this->error("添加失败","Add",5); } }
view\ShowAll.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <h1>info表</h1> <table width="100%" cellpadding="0" cellspacing="0" border="1"> <tr> <td>代号</td> <td>姓名</td> <td>性别</td> <td>民族</td> <td>生日</td> </tr> <foreach name="xinxi" item="v"> <tr> <td><{$v.code}></td> <td><{$v.name}></td> <td><{$v.sex}></td> <td><{$v.nation}></td> <td><{$v.birthday}></td> </tr> </foreach> </table> </body> </html>
页面显示效果:
添加成功:
如果添加失败:
注意:如果是主键值重复,这种错误会导致error()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到