• 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 AdminModel;
    use ThinkModel;
    class CarModel extends Model
    {
        
    }

    实例化MODEL类

    $car = new AdminModelCarModel();//根命名空间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 AdminModelCarModel();//根命名空间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();

    前端代码:AdminviewMainShowAll.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控制器实现两个逻辑,一个是打出添加页面,一个是向数据库添加内容

    例子:HomeMainControllerShowAll

            //三 自动收集表单
            
            $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);    
                }
            }

    viewShowAll.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()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到

  • 相关阅读:
    网页中这 10 种字体的运用方式,不会让人觉得 Low
    如何估算文章阅读时长?
    如何养出一个三十几亿身家的儿子
    2018免费的隐私保护工具
    写一份好的产品说明书
    安装 Ubuntu 19.10 选用 zfs 文件系统
    ESXI常用命令
    Harbor ($docker login) Error saving credentials
    Vue中使用matomo进行访问流量统计的实现
    eslint Cannot read property 'range' of null错误
  • 原文地址:https://www.cnblogs.com/Duriyya/p/5591974.html
Copyright © 2020-2023  润新知