ThinkPHP框架之模型

一、数据库配置

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

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

二、Model模型

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

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

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

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

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

<?php
namespace Home\Model;
use Think\Model;
class InfoModel extends Model
{

}

MainController.class.php中:

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

请求ShowAll方法:

     

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

$info = D("Info");  //造的是父类Think\Model的对象
 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>
时间: 2024-10-14 17:02:42

ThinkPHP框架之模型的相关文章

ThinkPHP 框架模型

本文和大家分享的主要是ThinkPHP 框架模型相关内容,一起来看看吧,希望对大家学习php有所帮助. 1 在MainController.class.php 控制器中有一个test的方法,同时还有一个deng的方法,我想在test方法中使用deng方法 表示为 <?phpnamespace Home\Controller;use Think\Controller;class MainController extends controller{ public function test() {

关于Thinkphp框架模型应用过程中出现的错误Undefined class constant MYSQL_ATTR_INIT_COMMAND

今天在用thinkphp框架做网站的时候,在调用model模型是意外发生Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]错误, 下面是我百度的结果,大部分说解决问题可以分为以下两类: 1. windows下iis7.5+php5.4.11(FastCGI) 缺少pdo,编辑php.ini 取消注释: extension=php_pdo_mysql.dll 重启iis PHP数据对象(PDO)扩

ThinkPHP框架模型连贯操作(八)

原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where 帮助我们设置查询条件 2.order 对结果进行排序 $arr=$m->order('id desc')->select(); $arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select(); 多个字段排序 //数组形式

ThinkPHP框架快速开发网站

使用ThinkPHP框架快速搭建网站 这一周一直忙于做实验室的网站,基本功能算是完成了.比较有收获的是大概了解了ThinkPHP框架.写一些东西留作纪念吧.如果对于同样是Web方面新手的你有一丝丝帮助,那就更好了挖. 以前用PHP做过一个很蹩脚的网站,为什么这么说呢,因为写的全是死代码.做完以后觉得实在是累,前端要div+css,js 后端要php,mysql,这么多东西要弄,十分头疼.所以,在接到做网站的任务后,我第一时间想到一定要使用开发框架去做,绝不能跟以前一样那么累了. 我选择的是PHP

学习ThinkPHP框架必须了解的知识点(一)

1.框架:有大量的类.方法.函数按一定的逻辑组成的集合: 2.MVC(Model-View-Controller):即模型-视图-控制器这种编程模式:  M->Model:实体层,它主要是对数据库的操作:每一个Model.cs文件对于一张数据表,和它相应的数据库库操作:  V->View:视图层,可以简单的理解为模板,主要是展示作用:  C->Controller:控制层(控制器),对数据进行分析.过滤:它向上连接视图层,向它提供从数据口读取的数据,向下连接实体层,控制数据的读取.  M

ThinkPHP框架基本知识,介绍给新人

tp基础框架基本知识 thinkPHP框架简称TP框架: index.php:项目的入口文件,所有的页面都从这个页面进入application:存放项目的文件夹public:存放公有的东西thinkPHP:TP框架的核心文件夹,里面的东西尽量不要修改里面包含:1.common:核心函数库,用户自定义的函数可以存在这里面2.conf:配置文件,主要在里面的convention.php3.lang:语言包4.library:存放TP核心类文件,里面的think存放类,我们使用的类基本都在5.mode

ThinkPHP框架基础3

连接数据库 把convertion.php数据库相关的设置复制到config.php 在config.php做数据库连接配置,设置好数据 制作model模型 a)        model本身就是一个类文件 b)        数据库中的每个数据表都对应一个model模型文件 c)         最简单的数据model模型类 $goods =  new  命名空间GoodsModel(); $goods = D(‘模型标志’); a)        $goods = D(“Goods”); b

Thinkphp入门 五 —模型 (49)

原文:Thinkphp入门 五 -模型 (49) [数据库操作model模型] model  模型  数据库操作 tp框架主要设计模式:MVC C:controller   控制器   shop/Lib/Action/具体控制器 V:view       视图     shop/Tpl/分组/模板文件 M:model      数据模型  shop/Lib/Model/具体模型 [创建模型] 创建的原则:一个数据表对应一个数据模型 创建模型: 当出现以下信息,说明我们的数据库没有配置用户名和密码

ThinkPHP框架基础知识

ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库).RoR的ORM映射和ActiveRecord模式. ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支