ThinkPHP总结
一.模型实例化
1.直接实例化
$User = new \Home\Model\UserModel();
$Info = new \Admin\Model\InfoModel();
// 带参数实例化
$New = new \Home\Model\NewModel('blog','think_',$connection);
二.连接数据库
全局配置定义:
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => '127.0.0.1', // 服务器地址
'DB_NAME' => 'thinkphp', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '123456', // 密码
'DB_PORT' => 3306, // 端口
'DB_PREFIX' => 'think_', // 数据库表前缀
'DB_CHARSET'=> 'utf8', // 字符集
'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志
//在模型里单独设置数据库连接信息
namespace Home\Model;
use Think\Model;
class UserModel extends Model{
protected $connection = array(
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '1234',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'thinkphp',
'db_charset' => 'utf8',
);
}
然后new出数据库对象就可以对数据库进行操作
如果配置多个数据库可以使用关键字调用其中一个数据库:protected $connection = 'DB_CONFIG1'
三.实例化模型
1.直接实例化
例:$goods=new \Home\Model\GoodsModel();
2.D方法实例化
D方法的参数就是模型的名称,并且和模型类的大小写定义是一致的
例:
public function test1(){
$goods=D('Goods');
dump($goods->GoodsList());
}
一个模型类文件对应一个数据表,使用D方法来进行查找,他会现在模型文件中找有没有相对应的模型文件,如果没有,
他会自动使用系统配置的基础模型来进行查找,可以保证每次查询都能查到东西
首先实例化当前模块下对应的Model类,如果不存在,则会去公共模块(Common)下找想对应的Model类,如果还不存在,
则实例化基础类Model
跨模块使用模型中的类方法必须跟上哪个模块下的模型中的方法
3.M方法实例化
D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,
使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高
M方法会直接对基础模型类里的方法进行操作,会绕过自己定义的一些模型方法
4.实例化空模型
如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作
例:
public function test8(){
$m=M();
//dump($m->query("select * from yh_goods")); //查询
dump($m->execute("update yh_goods set price=8888 where id=1")); //写入
}
使用空方法进行原声SQL查询,一般建议使用query进行查询,execute进行写入
四.分布式数据库支持:可以把数据库放在多台服务器上,对数据库进行优化,减少服务器的压力
例:
//分布式数据库配置定义
'DB_DEPLOY_TYPE'=> 1, // 设置分布式数据库支持 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'DB_TYPE' => 'mysql', //分布式数据库类型必须相同
'DB_HOST' => '192.168.0.1,192.168.0.2',
'DB_NAME' => 'thinkphp', //如果相同可以不用定义多个
'DB_USER' => 'user1,user2', //数据库的账号
'DB_PWD' => 'pwd1,pwd2', //数据库的密码
'DB_PORT' => '3306', //数据库的端口
'DB_PREFIX' => 'think_', //数据表的前缀
'DB_RW_SEPARATE' => true, // 数据库读写是否分离 主从式有效
'DB_MASTER_NUM' => 1, // 读写分离后 主服务器数量
五.切换数据库
在模型操作过程中动态的切换数据库,支持切换到相同和不同的数据库类型:
Model->db("数据库编号","数据库配置");
例:$this->db(1,"mysql://root:123456@localhost:3306/test")->query("查询SQL");
六.字段定义
// 关闭字段缓存
'DB_FIELDS_CACHE'=>false
系统会在模型首次实例化的时候自动获取数据表的字段信息(而且只需要一次,以后会永久缓存字段信息,除非设置不缓存或者删除),
如果是调试模式则不会生成字段缓存文件,则表示每次都会重新获取数据表字段信息。字段缓存保存在 Runtime/Data/_fields/ 目录下面,
缓存机制是每个模型对应一个字段缓存文件(注意:并非每个数据表对应一个字段缓存文件)
命名格式是:数据库名.数据表前缀+模型名(小写).php
如果我们想开启字段缓存:
1.关闭调试模式:define('APP_DEBUG',false);
2.开启页面追踪:在应用配置文件中开启'SHOW_PAGE_TRACE' =>true;
getDbFields() 取当前数据表的字段信息
七.CURD操作(添加、更新、读取、删除)
create update read delete
1.数据创建
create() 根据表单提交的POST创建数据对象 使用这个方式必须数据表里的字段和前端页面里的name名一样才能拿到
这个方法默认方式是POST提交数据类型,如果是GET数据类型在这个方法中写:create($_GET);就可以拿到
create方法的第二个参数可以指定创建数据的操作状态,系统内置的数据操作包括 Model::MODEL_INSERT (或者1)
和 Model::MODEL_UPDATE (或者2)默认情况下是自动判断是写入还是更新操作 如果有隐藏域的话主键ID 他会自动
判断是更新操作,如果没有的话就要想做更新操作就要在第二个参数写上2 代表更新操作
create方法的工作流程:
1 获取数据源(默认是POST数组)
2 验证数据源合法性(非数组或者对象会过滤) 失败则返回false
3 检查字段映射
4 判断数据状态(新增或者编辑,指定或者自动判断)
5 数据自动验证 失败则返回false
6 表单令牌验证 失败则返回false
7 表单数据赋值(过滤非法字段和字符串处理)
8 数据自动完成
data() Data方法也支持传入数组和对象,使用data方法创建的数据对象不会进行自动验证和过滤操作,请自行处理
add() 进行插入数据
save() 进行数据更新
例:
//先实例化模型
$member=M('member');
//这个模型先拿到传输过来的数据
$data=$member->create();
//将拿到的数据添加到想对应的表文件中
$member->data($data)->add();
2.支持的连贯操作
可以调用相关的连贯操作方法,配合完成数据创建操作
field() 用于定义合法的字段 字符串和数组 例如插入用户名的时候,想插入哪个字段里就在这个方法中写入字段名
validate() 用于数据自动验证 数组
auto() 用于数据自动完成 数组
token() 用于令牌验证 布尔值
3.数据写入
comment() 注释方法
fetchSql() 模拟的走一遍数据库操作程序,看看有没有错误,可以通过echo 把这句sql语句打印出来
例:$member->data($data)->comment('这是一个插入语句')->fetchSql()->add();
filter() 进行数据过滤
例:filter('trim') 使用去空格过滤 一般使用PHP函数进行操作
4.数据更新
更新数据使用 save 方法
更新数据一般是要跟条件的,有两种方法:
可以在模板中创建一个隐藏域,写入更新的主键ID
也可以使用 where() 条件方法 进行条件添加
例:
$member=D("member");
$data=$member->create();
$data['add_time']=time();
$member->where('id=3')->save($data);
如果只更新个别字段
setField()
例:$member->where("id=3")->setField("user_name",'Rose');
自增/自减
setInc 和 setDec 方法 默认是自增自减1
也可以针对某个字段进行自增自减
例:
$member->where("id=3")->setInc("money",1000);
$member->where("id=3")->setDec("money",500);
删除操作
delete() 删除方法
查询操作
find() 单记录查询
select() 多记录查询 里面可以跟查询的主键ID 用的in方法
查询语句支持以下方法:
where 用于查询或者更新条件的定义 字符串、数组和对象
table 用于定义要操作的数据表名称 字符串和数组
alias 用于给当前数据表定义别名 字符串
field 用于定义要查询的字段(支持字段排除) 字符串和数组
order 用于对结果排序 字符串和数组
group 用于对查询的group支持 字符串
having 用于对查询的having支持 字符串
join 用于对查询的join支持 字符串和数组
union 用于对查询的union支持 字符串、数组和对象
distinct 用于查询的distinct支持 布尔值
lock 用于数据库的锁机制 布尔值
cache 用于查询缓存 支持多个参数
relation 用于关联查询(需要关联模型支持) 字符串
result 用于返回数据转换 字符串
scope 用于命名范围 字符串、数组
bind 用于数据绑定操作 数组
comment 用于SQL注释 字符串
fetchSql 不执行SQL而只是返回SQL 布尔值
limit 查询的条数
getField() 读取字段值
有两个参数
第一个是拿的字段名,默认的只拿字段中第一行的值
第二个参数是true,如果设置了第二个参数会把字段中所有的值都读出来
这个方法也也可以拿多个字段中的值,写字段参数的时候以逗号隔开