6月16 ThinkPHP连接数据库及Model数据模型层--------查询及数据添加

Posted Durriya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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表为例

        $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);
View Code

 

模糊查询注册变量前端显示

//注册数组前端显示
        $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

<!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>
View Code

显示效果:

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 收集表单数据入库操作

  1. 制作一个表单
  2. 通过$_POST收集信息
  3. 通过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()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到

 

 

以上是关于6月16 ThinkPHP连接数据库及Model数据模型层--------查询及数据添加的主要内容,如果未能解决你的问题,请参考以下文章

6月17 ThinkPHP连接数据库------数据的修改及删除

6月16日 TP框架数据库的查询及添加

Thinkphp 连接数据库查询添加

ThinkPHP讲解——数据库配置及Model数据模型层查询

6月19 使用tp框架生成验证码及文件上传

thinkphp model 必须对应数据库表名