• ThinkPHP框架之模型


    一、数据库配置

    在父类配置ThinkPHP/Conf/convention.php中,找到数据库设置部分:

    将这部分复制到我们模块的配置文件Home/Conf/config.php中,将需要的参数写上:

    二、Model模型

    数据库中每一张表对应一个模型,类名就是表名,类里面的成员变量就是列名,

    把一张表对应为一个类,其中一条数据对应一个对象

    如果我们对该表的模型没有特殊操作的话可以不用建立该模型,但C层和V层必须有

    实例化Model的三种方式:以Info表为例:

    1.用new的方式:需要自己创建模型文件,需要哪个表的模型,就去建哪个表的Model:在Home/Model/中新建InfoModel.class.php

    <?php
    namespace HomeModel;
    use ThinkModel;
    class InfoModel extends Model
    {
            
    }

     MainController.class.php中:

    function ShowAll()
    {
        $info=new HomeModelInfoModel();  //必须是绝对路径  从初始命名空间开始
        var_dump($info);
    }

    请求ShowAll方法:

         

    2.使用D方法,不用建模型文件,实例化父类Model的对象

    $info = D("Info");  //造的是父类ThinkModel的对象
     var_dump($info);

    再次请求ShowAll方法:

       

    3.使用M方法, 实例化父类Model

    $info = M();可以直接调用父类Model里边的属性,获得数据库相关操作,但没有具体表的数据

    $info = M("Info");这样就可以操作Info表数据

    注意:如果没有对应的model模型文件类,也可以直接实例化model对象进行操作

    三、数据查询连贯操作

    以Car表为例:

    $car = M("car");
            //var_dump($car);
            $car->select(); //返回所有数据二维数组
            
            //连贯操作 返回的是对象,可以继续调用,但select()返回的是二维数组,不能继续调用,所以放在最后
            $attr = $car->where("brand='b002'")->select(); //where方法可以添加查询条件
            
            $attr = $car->table("Nation")->select();  //table方法可以切换表
            
            $attr = $car->field("name,code")->select();  //field方法可以查询指定字段
            
            $attr = $car->order("oil desc")->select(); //order方法可以进行排序
            
            $attr = $car->limit(3)->select(); //limit可以分页查询,若只有一个参数,就取前n个;若是两个,就是跳过m个取n个
            
            $attr = $car->page(1,3)->select; //扩展 page方法可以取第m页的n条数据
            
            $attr = $car->field("Brand,count(*)")->group("Brand")->select(); //group方法是分组查询
            
            $attr = $car->join("Brand on Car.Brand = Brand.Brand_Code")->select(); //join方法可以连接查询
            
            $attr = $car->distinct(true)->field("Brand")->select(); //distinct方法,参数为true可以去重
            
            $attr= $car->find("c002"); //只能根据主键值查询一条数据,返回一维数组,若不写主键值默认返回第一条数据
            
            $attr= $car->select("c001,c002"); //根据主键值查询 返回二维数组,参数可以写多个,必须是主键值
            var_dump($attr);
            
            $attr = $car->count();   //聚合函数 返回字符串
            $attr = $car->max("Price");
            $attr = $car->min("Price");
            $attr = $car->sum("Price");
            $attr = $car->avg("Price");
            echo $attr;
            

    以上许多方法执行没有顺序要求,许多方法执行后都是把具体的参数赋予到model属性options里边,最后根据options拼装sql语句。

    做一个简单的查询:

    $tj = "1=1";
            if(!empty($_POST["name"]))
            {
                $name = $_POST["name"];
                $tj= "Name like '%{$name}%'";            
                $this->assign("name",$name);
            }
            $attr = $car->where($tj)->select();                
            $this->assign("car",$attr);
            $this->display();    

    模板ShowAll.html代码:

    <h1>汽车表</h1>
    <form action="__ACTION__" method="post">
    <div>请输入名称:<input type="text" name="name"  value="<{$name}>"/> <input type="submit" value="查询" /></div>
    </form><br />
    
    <table width="800" border="1" cellpadding="0" cellspacing="0">
    <tr>
        <td>代号</td>
        <td>名称</td>
        <td>系列</td>
        <td>上市时间</td>
        <td>油耗</td>
        <td>功率</td>
    </tr>
    <foreach name="car" item="v">
    <tr>
        <td><{$v.code}></td>
        <td><{$v.name}></td>
        <td><{$v.brand}></td>
        <td><{$v.time}></td>
        <td><{$v.oil}></td>
        <td><{$v.powers}></td>
    </tr>
    </foreach>
    </table>

    请求ShowAll方法:

    四、添加数据

    以Info表为例:

    添加数据使用add()方法,有三种方式:

    1.使用数组的方式

    $model = D("Info");   //实例化对象
                                    
                //一、添加数据的第一种方式:使用数组
                //要添加的数组,必须是关联数组,key必须为字段名称(大小写必须一致)
              $attr = array(
                'Code' =>'p100',
                'Name' =>'骆冰',
                'Sex' =>true,
                'Nation' =>'n004',
                'Birthday' =>'1996-6-9' 
                );            
                $model->add($attr);  //添加数据需要参数(该参数是一个关联数组)
                
                //也可以用赋值的方式添加:
                $attr["Code"] = "p010";
                $attr["Name"] = "小乔";
                $attr["Sex"] = false;
                $attr["Nation"] = "n005";
                $attr["Birthday"] = "1999-9-9";
                $model->add($attr);

    2.使用AR方式

    //二.AR方式  操作对象的方式
                //1.连接类  2.实体类  3.数据访问类   
                $model = D("Info");
                $model->Code = 'p112';  //若有自增长列,可以不用写
                $model->Name = '寒冰';
                $model->Sex = false;
                $model->Nation = 'n007';
                $model->Birthday = '1992-2-14';
                $model->add()

    3.自动收集表单添加数据   create()

    if(empty($_POST))
            {
                $this->display();   //若没有传值则显示模板页面    
            }
            else
            {
                $model = D("Info"); 
                $model->create(); //自动收集表单并且创建数据
                $model->Sex = $_POST["Sex"]=="男"?true:false; //若自动收集的表单无法直接添加,就要拿出来特殊处理
                $r = $model->add();
                if($r)
                {
                    $this->success("添加成功!","Add",3);    //success和error方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒),默认success为1秒,error为3秒
                }
                else
                {
                    $this->error("添加失败!","Add",5);
                }
                
            }

    模板页面Add.html代码:

    <form action="__ACTION__" method="post">  <!--提交到当前方法处理 -->
    <div>代号:<input type="text" name="Code" /></div><br />  <!--name值必须与数据库中字段名完全相同,顺序可以随意 -->
    <div>姓名:<input type="text" name="Name" /></div><br /> <!--若name值与数据库中字段不同,也可以添加,不会报错,而create方法会自动过滤,该列为空;但若是该列不允许为空,则不会添加数据,也不会报错 -->
    <div>性别:<input type="text" name="Sex" /></div><br />
    <div>民族:<input type="text" name="Nation" /></div><br />
    <div>生日:<input type="text" name="Birthday" /></div><br />
    <input type="submit" value="添加" />
    </form>

    add()方法:成功返回1,失败返回false。

    推荐用自动收集表单的方式添加数据

    五、修改数据

    修改数据用save()方法

    与添加数据对应,修改数据也有三种方式:

    1.使用数组的方式

    function Update()
        {
            $model = D("Info");    
                    //1、数组方式
                $attr = array(
                  "Code"=>"p100",   //根据主键值修改
                  "Name"=>"罗宾",
                  "Sex"=>false,
                  "Nation"=>"n005",
                  "Birthday"=>"1989-8-9"
                );
                //调用save方法修改数据
                $model->save($attr);
        }   

    2.使用AR的方式

    //2、AR方式
                           $model = D("Info");    
                $model->Name = "娜美";
                $model->Nation = "n009";
                //一定要根据主键值修改,不能用find,因为find返回的是一维数组,而不是对象,无法调用save方法
                $model->where("Code = 'p112'")->save();        

    3.自动收集表单修改数据:

    function Update()
        {
            $model = D("Info");    
            if(empty($_POST))
            {
                //因为没有做显示数据页面,所以直接传一个主键值过来示范
                $code = "p010";
                $attr = $model->find($code);//返回一维数组
                $this->assign("shuju",$attr);
                $this->display();
            }
            else
            {        
           $model->create();  //主键值只用于查询,不参与修改
                $model->save();
            }

    模板Update.html代码:

    <h1>修改页面</h1>
    <form action="__ACTION__" method="post">
    <input type="hidden" name="Code" value="<{$shuju.code}>" />  <!--name值必须与数据库中字段名完全相同,顺序可以随意 -->
    <div>姓名:<input type="text" name="Name" value="<{$shuju.name}>" /></div><br /> <!--若name值与数据库中字段不同,也可以添加,不会报错,而create方法会自动过滤,该列为空;但若是该列不允许为空,则不会添加数据,也不会报错 -->
    <div>性别:<input type="text" name="Sex" value="<{$shuju["sex"]?"男":"女"}>" /></div><br />
    <div>民族:<input type="text" name="Nation" value="<{$shuju.nation}>" /></div><br />
    <div>生日:<input type="text" name="Birthday" value="<{$shuju.birthday}>" /></div><br />
    <input type="submit" value="修改" />
    </form>

    推荐用自动收集表单的方式修改数据

    六、删除数据

    删除数据用delete()方法,不用做模板页面

    //删除数据
        function Delete()
        {
            $model = D("Info");        
            //1.根据主键值删除
            $model->delete("p100");
            //2.根据条件删除
            $model->where("Nation='n001'")->delete();            
        }

    七、练习:Info表的增删改查

    主页面(ShowInfo):

    //显示所有数据
        function ShowInfo()
        {
            $model = D("Info");
            //若用join联合查询时两张表中有相同字段,可用as 别名的方式加以区分,在模板中取值时有别名的也要用别名,否则会出错  
            $attr = $model->field("Info.Code as infocode,Info.Name as infoname,Info.Sex,Nation.Name as nationname,Info.Birthday")->join("Nation on Info.Nation=Nation.Code")->select();
            //var_dump($attr);
            $this->assign("shuju",$attr);
            $this->display();    
        }

    模板ShowInfo.html:

    <h1>主页面</h1>
    <table width="100%" border="1" cellpadding="0" cellspacing="0">
    <tr>
    <td>代号</td>
    <td>姓名</td>
    <td>性别</td>
    <td>民族</td>
    <td>生日</td>
    <td>操作</td>
    </tr>
    <foreach name="shuju" item="v">
    <tr>
    <td><{$v.infocode}></td>
    <td><{$v.infoname}></td>
    <td><{$v["sex"]?"男":"女"}></td>    <!-- 三元运算符不允许用点方法,所以用关联key -->
    <td><{$v.nationname}></td>
    <td><{$v.birthday}></td>
    <td><a href="__CONTROLLER__/XiuGai/code/<{$v.infocode}>">修改</a>
      <a href="__CONTROLLER__/ShanChu/code/<{$v.infocode}>">删除</a></td>
    </tr>
    </foreach>
    </table>
    <br />
    <a href="__CONTROLLER__/TianJia">添加数据</a>

     添加数据(TianJia):

    //添加数据
        function TianJia()
        {        
            if(empty($_POST))
            {
                $model = D("Nation");
                $attr = $model->select();
                //var_dump($attr);
                $this->assign("nation",$attr);            
                $this->display();    
            }
            else
            {
                $model = D("Info");    
                $model->create();
                $model->Sex = $_POST["Sex"]==1?true:false;
                $r = $model->add();
                if($r)
                {
                    $this->success("添加成功!","TianJia");
                }
                else
                {
                    $this->error("添加失败!");
                }
            }
        }

    模板TianJia.html:

    <h1>添加数据</h1>
    <form action="__ACTION__" method="post">  <!--提交到当前方法处理 -->
    <div>代号:<input type="text" name="Code" /></div><br />  <!--name值必须与数据库中字段名完全相同,顺序可以随意 -->
    <div>姓名:<input type="text" name="Name" /></div><br /> <!--若name值与数据库中字段不同,也可以添加,不会报错,而create方法会自动过滤,该列为空;但若是该列不允许为空,则不会添加数据,也不会报错 -->
    <div>性别:<input type="radio" name="Sex" value="1" /><input type="radio" name="Sex" value="0" /></div><br />
    <div>民族
            <select name="Nation">
            <foreach name="nation" item="v">
                <option value="<{$v.code}>"><{$v.name}></option>
            </foreach>
            </select>
    </div><br />
    <div>生日:<input type="text" name="Birthday" /></div><br />
    <input type="submit" value="添加" />
    </form>
    <br />
    <a href="__CONTROLLER__/ShowInfo">返回主页面</a>

    删除数据(ShanChu):

    //删除数据
        function ShanChu($code)
        {
            $model = D("Info");
            $z = $model->delete($code);    
            if($z)
            {
                $this->success("删除成功!",U("ShowInfo"));//跳转到主页面    
            }
            else
            {
                $this->error("删除失败!");    
            }
        }

    修改数据(XiuGai):

    //修改数据
        function XiuGai($code)
        {
            $model = D("Info");    
            if(empty($_POST))
            {
                $modeln = D("Nation");
                $attrn = $modeln->select();           
                $attr = $model->find($code);            
                $this->assign("nation",$attrn);
                $this->assign("info",$attr);
                $this->display();    
            }    
            else
            {
                $model->create();
                $model->Sex=$_POST["Sex"]==1?true:false;  //post传递过来的值是字符串,而sex不能是字符串,必须换成true or false,否则会失败
                $z = $model->save();
                if($z)
                {
                    $this->success("修改成功!",U("ShowInfo")); //若不写第二个参数,修改完后还是在修改页面
                }
                else
                {
                    $this->error("修改失败!"); //error方法的默认跳转地址是javascript:history.back(-1);即修改页面    
                }            
            }
        }

    模板XiuGai.html:

    <h1>修改数据</h1>
    <form action="__ACTION__/code/<{$info.code}>" method="post">  <!--注意要传参数 -->
    <input type="hidden" name="Code" value="<{$info.code}>" />  <!--name值必须与数据库中字段名完全相同,顺序可以随意 -->
    <div>姓名:<input type="text" name="Name" value="<{$info.name}>" /></div><br /> <!--若name值与数据库中字段不同,也可以添加,不会报错,而create方法会自动过滤,该列为空;但若是该列不允许为空,则不会添加数据,也不会报错 -->
    <div>性别:<input type="radio" name="Sex" value="1" <{$info["sex"]?"checked='checked'":""}> />男
            <input type="radio" name="Sex" value="0" <{$info["sex"]?"":"checked='checked'"}> />女
    </div><br />
    <div>民族
            <select name="Nation">
            <foreach name="nation" item="v">  <!--标签嵌套 -->
            <if condition="$info['nation']==$v['code']">
                <option selected="selected" value="<{$v.code}>"><{$v.name}></option>
            <else />
                <option value="<{$v.code}>"><{$v.name}></option>
            </if>
            </foreach>
            </select>
    </div><br />
    <div>生日:<input type="text" name="Birthday" value="<{$info.birthday}>" /></div><br />
    <input type="submit" value="修改" />
    </form>
  • 相关阅读:
    DOCKER启动失败Job for docker.service failed because the control process exited with error code. See "syste mctl status docker.service" and "journalctl -xe" for details.
    windows查看系统安装的补丁
    vue生命周期
    VUE 图片上传/剪切(vue-cropper)
    mysql性能优化关键点
    element vue-quill-editor 富文本编辑器 安装使用
    Module build failed: Error: Node Sass version 6.0.0 is incompatible with ^4.0.0.
    npm ERR! 404 You should bug the author to publish it (or use the name yourself!) npm ERR! 404 It was specified as a dependency of 'hr_front_end'
    __WEBPACK_AMD_DEFINE_ARRAY__ is not defined
    利用BERT得到句子的表示向量(pytorch)
  • 原文地址:https://www.cnblogs.com/xinghun/p/5599390.html
Copyright © 2020-2023  润新知