tp3.1 mysql 事务_Tp3.1.2模型学习

本文详细介绍了ThinkPHP5框架中关于数据模型的定义、实例化、数据库连接配置、数据创建、更新、删除的方法,以及事务支持、自动验证、字段过滤、视图模型和关联模型的使用。内容涵盖从基本的数据操作到高级特性的应用,旨在帮助开发者更好地理解和掌握ThinkPHP5的模型管理。
摘要由CSDN通过智能技术生成

1.模型定义

命名规则是除去表前缀的数据表名称,采用驼峰命名,并且首字母大写,然后加上后缀Model

其中tableName是不包含表前缀的数据表名称,一般用于模型和表名称不同时候需要定义

其中trueTableName是包含千醉的表名称,这就说如果表为数据库中实际操作的表

dbName是要对应的数据库,只有跨库操作才需要定义

2.模型实例化

$User = new Model(‘User’);//等效与$User = M(‘User’);

这样的没有办法进行业务相关的逻辑处理

$User = new CommonModel(‘User’);//第一个参数是模型名称,第二个是表前缀,第三个是数据库连接信息

这样就可以携程$User = M(“CommonModel:User”);//当时CommonModel必须继承系统的Model

自定义模块可以用D方法进行实例化 $User = D(‘News’);

D方法可以自动检测模型类,存在自定义则试用自定义,不存在则实例化Model基类,实例化过的模型不会重复实例化

D方法支持跨项目和分组调用D(“Admin://User”)实例化Admin项目中的User模型,D(“Admin/User”);实例化admin分组的User模型

实例化空模型可以使用new Model()或者 M();

‘DB_FIELDS_CACHE’=>false //可以关闭字段缓存,调试模式下默认是关闭的

3.连接数据库配置

return array(

‘DB_TYPE’ => ‘mysql’, // 数据库类型

‘DB_HOST’ => ‘localhost’, // 服务器地址

‘DB_NAME’ => ‘test’, // 数据库名

‘DB_USER’ => ‘test’, // 用户名

‘DB_PWD’ => ‘test’, // 密码

‘DB_PORT’ => 3306, // 端口

‘DB_PREFIX’ => ‘test_’, // 数据库表前缀

);

可以使用DB_DSN方式连接,可以用pdo形式

4.分布式数据库

return array(

‘DB_TYPE’ => ‘mysql’, //分布式数据库类型必须相同

‘DB_HOST’ => ‘192.168.0.1,192.168.0.2’,

‘DB_NAME’ => ‘test’, //如果相同可以不用定义多个

‘DB_USER’ => ‘test1,test2’,//帐号,如果一样可以只写一个

‘DB_PWD’ => ‘test1,test2’,//密码

‘DB_PORT’ => ‘3306’,//如果端口一样可以写一个

‘DB_PREFIX’ => ‘test_’,

‘DB_RW_SEPARATE’=>true,//默认读写不分离,需要分离请设置

可以配置多个主数据库

);

5.创建数据

create()可以创建数据对象,$user = D(‘User’);

$user->create();//默认获取post数组,验证数据源合法性,检查字段类型,判断插入还是更新

自动验证,自动完成,表单令牌验证,表单数据过滤,数据自动完成,生成数据对象(这个时候保存内存中)

只有当调用了add()或者save方法才会保存到数据库

6.ADD方法

$user = M(“User”);

$data = array(‘name’=> ‘新闻标题’, ‘content’ => ‘新闻内容’);

//方法一

$user->add($data);

//方法二

$user->data($data)->add();

//方法三

$user->create();//获取POST的数据

$user->add();

查询方法select返回多行记录而find只会返回一行记录;getField可以指定返回字段值

更新数据方式一

如果id是主见可以这样更新数据

$data[‘id’] = 1;

$data[‘name’] = ‘

更新数据方式二

$data[‘name’] = ‘

//更新方式三

$user->create()->save();//更具 提交的post数据创建对象进行更新,需要主键

更新某个字段

setField($field, $value=”);//其中可以支持传递数组

setInc($field, $step = 1);//增加

setDec($field, $step = 1);//减少

删除记录支持order以及limit连贯操作

7.ActiveRecord

创建数据

$user->name = ‘Joyous’;

$user->email=’joyousphper@gmail.com’

$user->add();//将数据保存到数据库

同样,在我们用

$user->create();方法之后仍然可以用

$user->name = ‘Joyous’;//更改属性值

查询记录

$user->find(8);//这个只能查询主键

根据字段查询

$user->getByName(“Joyous”);//相当于$user->wherr(“name=’Joyous'”)->select();

//根据主键查询多个数据

$user->select(“1,2,3,6”);

更新记录

$user->find(1);//多了一次查询,可以用$user->id = 1;也可以

$user->name = ‘Joyous’;

$user->save();//保存数据

删除记录

$user->delete(2);//可以根据主键直接删除

$user->delete(“3,45”);

8.自动验证

$_validate属性,二维数组,其中array(验证的字段,验证规则,错误提示,[验证条件,附加条件])

验证的字段是来自表单的字段

验证规则可以系统的require,email,url,currency,number等

错误提示可以用$user->getError();获取

验证条件Model::EXISTS_VALIDATE 或者0标识存在字段就验证,Model::MUST_VALIDATE或者1必须验证 Model::VALUE_VALIDATE

2标识不为空则验证

附加规则,正则、函数,callback,confirm,equal,in等,默认用regex

自定义验证规则

$user = D(“User”);

$validate = array(array(‘verify’,’require’, ‘验证码必须’));

$user->setProperty(“_validate”, $validate);

多字段callback验证

protected $_validate = array(

array(‘user_id,good_id’, ‘checkIfOrderToday’, ‘今天已经购买过,请明天再来’, 1,’callback’, 1),

);

protected function checkIfOrderToday($data){

$map = $data;

$map[‘ctime’] = array(array(‘gt’,[开始时间]), array(‘lt’, [结束时间]));

if($this->where($map)->find())

return false;

else

return true;

}

patchValidate = true;在模型中定义就可以批量进行验证

check函数验证

$model->check($vale, ’email’);//默认用正则

9.命名范围

参考手册,主要是方便连贯操作

protected $_scope = array(

// 命名范围normal

‘normal’=>array(

‘where’=>array(‘status’=>1),

),

// 命名范围latest

‘latest’=>array(

‘order’=>’create_time DESC’,

‘limit’=>10,

),

);

使用

$Model->scope(‘normal’)->select();

生成SQL语句SELECT * FROM think_news WHERE status=1

目的,这样可以定义一个可以多次使用

10.自动完成

定义$_auto属性

默认填充时间是插入数据(插入,更新,插入和更新)的时候,默认插入规则是字符串插入有函数,回调,其他字段填充,字符串形式

array(‘status’, 1)//新增的时候把status的字段设置为1

array(‘password’,’md5′, 1, ‘function’);//新增数据的时候password字段进行md5处理

array(‘name’, ‘getName’, 1, ‘callback’);//name字段新增的时候回调getName方法

array(‘create_time’, ‘time’, 2, ‘function’)//更新的时候写入create_time当前最新时间

当然也可以自定义自动填充,参考自动验证

11.查询建议

虽然where语句中可以传入字符串和数组,但是建议用数组,默认试用and操作,如果需要更改之间逻辑,可以

$condition[‘_logic’] = ‘or’;

表达式查询,$map[‘字段’] = array(‘表达式’,’查询条件’);

其中表达式eq(=),neq(<>),gt(>),egt(>=),lt(

其中如果配置了DB_LIKE_FIELDS字段,那么配置的字段将进行模糊匹配

快捷查询

$map[‘name|title’] = ‘joyous’;

$user->where($map)->select();

12.字段排除

$model->field(‘id,name’)->select();//查询id和name字段

$model->field(‘create_time’,true)->select();//除了create_time之外的字段

13.事务支持

$user->startTrans();//需要数据库本身支持,比如mysql的MyISAM引擎不支持事务

if(成功) {

$user->commit();

} else {

$user->rollback();

}

14.高级模型

必须继承AdvModel

支持字段过滤,定义$_filter属性

支持字段序列化,定义$serializeField属性

文本字段定义$blobFields属性

只读字段类保护特殊的字段值不被更改,定义readonlyField属性

延迟更新需要$user->where(‘id=3’)->setLazyInc(‘score’, 10, 60);//用户积分延迟60s更新

数据分表定义$partition,其中array(

‘field’=>’name’,//要分表的字段,通常按照字段的值进行分表

‘type’ => ‘md5’,//分表的规则,包括id,year,mod,md5函数和首字母

‘expr’=>’name’,//分表辅助表达式 可选 配合不同的分表规则

‘num’=>’name’,//分表的数目

);

自定义返回类型,可以定义为对象,默认为数组

15.视图模型

继承ViewModel

定义viewFields属性

public $viewFields = array(

‘Blog’ => array(‘id’, ‘name’, ‘title’,’_table’=>’test.my_blog’),

‘Category’ => array(‘title’=>’cate_name’, ‘_on’ =>’Blog.category_id=Category.id),

‘User’ => array(‘name’=>’username’, ‘_on’ =>’Blog.user_id=User.id’),

);

//其中视图的表是用_table来定义,可以用_as来定义别名

_on来定义关联查询类型

定义join类型可以用_type

可以定义统计字段

使用视图

$model = D(“BlogView”);

$model->field(‘id,name,title,cate_name,username’)->where(“id>10”)->select();

16.关联模型

关联关系:一对一,一对多,多对多

定义$_link属性,可以动态定义,需要继承RelationModel类

其中mappint_type是关联类型;class_name关联的模型名,会自自动定位到相关数据表;

mapping_name是关联的映射名称,没有定义则试用class_name,如果class_name也没有则用数组索引

foreign_key外键默认为数据对象的_id,如果是User,那么外键就是user_id,如果不是则定义;

condition关联条件自动添加外键的值,如果是额外的需要定义;

mapping_fields关联要查询的字段,默认全部查询;

as_fields把关联的字段值映射成数据对象某一个字段的值

关联查询

$user=D(“User”);

$user->relation(true)->find(1);

关联操作可以参考手册内容

17.动态模型

$user=M(“User”);

$user->switchModel(“Adv”)->top10();//切换到高级模型执行top10查询

或者用$user = M(“AdvModel:User”)->top10();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值