一、数据库配置

在父类配置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>

ThinkPHP框架之模型的更多相关文章

  1. thinkphp框架之模型(数据库查询)

    1. 模型定义 文件名称必须是 表名+Model.class.php 例如:UserModel.class.php namespace Home\Model; //该模型类的命名空间 use Thin ...

  2. 关于thinkphp框架中模型笔记

    模型这一块,感觉学习的不是很清楚,单独水一贴thinkphp中模型的学习笔记. 0x01 模型类简介 数据库中每一张表对应一个模型,类名就是表名,类里面的成员变量就是列名, 把一张表对应为一个类,其中 ...

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

    原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where ...

  4. 攻城记:Thinkphp框架的项目规划总结和踩坑经验

    一.项目模块规划 1.项目分为PC端.移动端.和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin: 对应入口 ...

  5. ThinkPHP框架概述

    框架概述 1.什么是框架 框架,即framework.其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统. 2.框架的应用场景 ① 代码重用 ② 合理分工 ③ 解决团队协作开发问题 3. ...

  6. 使用ThinkPHP框架高速开发站点(多图)

    使用ThinkPHP框架高速搭建站点 这一周一直忙于做实验室的站点,基本功能算是完毕了.比較有收获的是大概了解了ThinkPHP框架.写一些东西留作纪念吧.假设对于相同是Web方面新手的你有一丝丝帮助 ...

  7. thinkphp框架使用心得

    接触的第一个PHP框架就是TP,在使用的了一段时间后就放弃了,说实话TP的弊端挺多,之后又接触laravel框架,慢慢的就爱上laravel这个框架了.这段时间由于公司的原因,又不得不使用thinkp ...

  8. ThinkPHP框架一

    1.1 框架的概念 框架其实就是可重用代码的集合,框架的代码是框架架构的代码,不是业务逻辑代码,框架代码保护类.方法.函数等等,框架代码按照一定的规则组合起来就形成了框架. 1.2 不使用框架开发的时 ...

  9. 浅析Thinkphp框架中运用phprpc扩展模式

    浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc ...

随机推荐

  1. Ajax实现异步上传图片

    要求:点击页面浏览按钮后,选择需要上传的图片,页面无刷新,将上传的图片展示出来 开发流程 一:在页面编写表单代码和js代码 <!DOCTYPE html PUBLIC "-//W3C/ ...

  2. 图像处理之优化---任意半径局部直方图类算法在PC中快速实现的框架

    在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...

  3. docker-py环境配置

    一.系统环境版本介绍: os-version: Linux -.el7.x86_64 python-version: Python six-version: python-six--.el7.noar ...

  4. MS SqlServer 2008R2- Sql语句循环遍历生成百条随机数

    Sql语句,循环遍历生成区间5~20的随机数语句如下: are @i int DECLARE @Result INT DECLARE @Upper INT DECLARE @Lower INT ) ) ...

  5. 【转】MySQL常用命令总结

    http://blog.csdn.net/qq_33850438/article/details/52144686 MySQL常用的基本操作,以下都是MySQL 5.0下测试通过首先说明下,记住在每个 ...

  6. 【BZOJ1189】[HNOI2007]紧急疏散evacuate 动态加边网络流

    [BZOJ1189][HNOI2007]紧急疏散evacuate Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空 ...

  7. IOS 预览pdf,word文档的集中方式

    在iPhone中可以很方便的预览文档文件,如:pdf.word等等,这篇文章将以PDF为例.介绍三种预览PDF的方式,又分别从本地pdf文档和网络上的pdf文档进行对比. 预览本地PDF文档: 1.使 ...

  8. jquery验证手机号码

    function checkSubmitMobil() { if ($("#tel").val() == "") { alert("手机号码不能为空! ...

  9. CoordinatorLayout Behaviors使用说明[翻译]

    翻译与:Intercepting everything with CoordinatorLayout Behaviors 使用过Android Design Support Library的小伙伴应该 ...

  10. CodeForces 667A Pouring Rain

    A. Pouring Rain time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...