关于TP5的java事务处理理有多个模型

tp5的模型练习 - ThinkPHP框架
写了一个读取数据的方法,用到了tp5的模型知识&h2&admin/controller/User.php&/h2&namespace&app\admin\
use&app\admin\controller\C
use&app\admin\model\User&as&UserM
use&app\admin\model\Group&as&GroupM
use&think\R
class&User&extends&Common
&&&&&&&&public&function&read($uid=[],$map='')
&&&&&&&&&&&&//批量数据查询
&&&&&&&&&&&&if(is_array($uid)){
&&&&&&&&&&&&&&&&//条件查询
&&&&&&&&&&&&&&&&if(!empty($map)){
&&&&&&&&&&&&&&&&&&&&$uid&=&UserModel::where($map)-&column(&uid&);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&//如果uid为空,代表全查
&&&&&&&&&&&&$users&=&UserModel::all($uid);
&&&&&&&&&&&&&&&&foreach&($users&as&$key&=&&$value)&{
&&&&&&&&&&&&&&&&&&&&$data&=&Array();
&&&&&&&&&&&&&&&&&&&&//为模型的字段赋值
&&&&&&&&&&&&&&&&&&&&$userdata[$key]&=&$value-&getData();
&&&&&&&&&&&&&&&&&&&&//获取当前记录的模型
&&&&&&&&&&&&&&&&&&&&$user&=&UserModel::get($value['uid'],'profile');
&&&&&&&&&&&&&&&&/*1对1关联*/
&&&&&&&&&&&&&&&&&&$userdata[$key]['profile']&=&$user-&profile-&getData();
&&&&&&&&&&&&&&&&/*1对多关联*/
&&&&&&&&&&&&&&&&&&&&foreach&($user-&hobby&as&$k&=&&$v)&{
&&&&&&&&&&&&&&&&&&&&&&&&$userdata[$key]['hobby'][$k]=$v-&getData();
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&/*多对多关联*/
&&&&&&&&&&&&&&&&&&&foreach&($user-&group&as&$k&=&&$v)&{
&&&&&&&&&&&&&&&&&&&&&&&$userdata[$key]['group'][$k]=GroupModel::get($v['gid'])-&getData();
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}else{//单一数据查询
&&&&&&&&&&&&&&&&$user&=&UserModel::get($uid,'profile');
&&&&&&&&&&&&&&&&$userdata&=&$user-&getData();
&&&&&&&&&&&&&&&&/*1对1*/
&&&&&&&&&&&&&&$userdata['profile']&=&$user-&profile-&getData();
&&&&&&&&&&&&/*1对多关联*/
&&&&&&&&&&&&foreach&($user-&hobby&as&$k=&$v)&{
&&&&&&&&&&&&&&&&$userdata['hobby'][$k]=$v-&getData();
&&&&&&&&&&&&}
&&&&&&&&&&&&/*多对多关联*/
&&&&&&&&&&&&&&&foreach&($user-&group&as&$k&=&&$v)&{
&&&&&&&&&&&&&&&&&&&$userdata['group'][$k]=GroupModel::get($v['gid'])-&getData();
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&return&$
&&&&&&&}&h2&admin/model/user.php&/h2&namespace&app\admin\
use&think\M
class&User&extends&Model
&&&&protected&$table&=&'user';
&&&&protected&$pk&=&'uid';
&&&&protected&$autoWriteTimestamp&=&
&&&&/*1對1*/
&&&&public&function&profile(){
&&&&&&&&return&$this-&hasOne('Profile','uid')-&field('uid,truename,birthday,phone,address');
&&&&/*1對多*/
&&&&public&function&hobby(){
&&&&&&&&return&$this-&hasMany('Hobby','uid');
&&&&/*多對多*/
&&&&public&function&group(){
&&&&&&&&return&$this-&belongsToMany('Group','user_group','gid','uid','GM');
}&h2&admin/model/profile.php&/h2&namespace&app\admin\
use&think\M
class&Profile&extends&Model
&&&&//&设置当前模型对应的完整数据表名称
&&&&protected&$table&=&'profile';
&&&&protected&$pk&=&'uid';
}&h2&admin/model/hobby.php&/h2&namespace&app\admin\
use&think\M
class&Hobby&extends&Model
&&&&protected&$pk&=&'hid';
&&&&protected&$table&=&'hobby';&&&
&&&&public&function&user(){
&&&&&&&&return&$this-&belongsTo('User');
}&h2&admin/model/group.php&/h2&namespace&app\admin\
use&think\M
class&Group&extends&Model
&&&&protected&$pk&=&'gid';
&&&&protected&$table&=&'group';
mysteryocean
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。tp框架事务处理 - CSDN博客
tp框架事务处理
当我们需要同时对多个表进行操作的时候就有必要进行事务处理,首先你的数据库和数据表必须满足事务处理,即表引擎为InnoDB
下面为一个demo
&//事务:表必须是innodb
& & //删除主表
$mod1 = M('User');
//删除详情表
& & $mod2 = M('Userdetail');
& & $mod1-&startTrans();//开启事务
& & if(!$mod1-&delete($id)){
& & $mod1-&rollback();
& & $this-&error('删除失败');
& & if(!$mod2-&delete($id)){
& & $mod2-&rollback();
& & $this-&error('删除失败');
& & $mod1-&commit();
& & $mod2-&commit();
本文已收录于以下专栏:
相关文章推荐
//事务调试,可跨表跨模型操作;
function test(){
$testmodel=M('Test');
$testmodel2=M('Test2');
$testmodel->s...
自己做一个测试,关于事务处理的。
在对多表进行操作的时候
基本上都离不开事务。
有的操作,是要由上一操作后,产的值(如主表里插入后,要获取插入的主键ID值,返回给下面处理表用。)带到后面的表处理...
转载自:http://blog.csdn.net/sinat_/article/details/
当我们需要同时对多个表进行操作的时候就有必要进行事务处理,首先你...
ThinkPHP提供了单数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法:
启动事务:
$User->startTrans();
数据库-基本操作:1、安装mysql追踪器2、MySQL预处理语句prepare、execute3、了解MySQL事务4、安装sqlyong工具1、数据库配置2、query execute原生sql语...
/tpshop/thinkphp5/224105
完全开发手册:/manual/thinkp...
ThinkPHP-图片附件上传至指定目录并地址插入数据库操作
RelateAction
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/
觉得博文有用,请点赞,请评论,请关注,谢谢!~
数据库必须掌握的“增...
数据库事务
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)为了说明问题,假设现在有表test1,test1有从表test2;test1属于test3,test1和test4多对多,关联表test1_test4。
1.定义关系
class Test1Model extends WdModel {
public function test2(){
return $this-&hasOne('Test2','test1_id');
public function test3(){
return $this-&hasMany('Test3','test1_id');
class Test2Model extends WdModel {
public function test1(){
return $this-&belongsTo('Test1','test1_id');
关系方法:hasOne,hasMany,belongsTo
参数一:模型名或则表明
参数二 : 关联字段
$test1 = D('Test1');
$rs = $test1-&with('test2')-&select();
预加载并加入查询条件
$rs = $test2-&with(array('test1',function($query){
$query-&field('id,name')-&where('id=2');
}))-&select();
如果需要同时加载多个关系模型可如下调用:
$this-&with('business','category','bag','admin',array('log',function($query){
$query-&where(array('gl_code'=&43));
}),array('sku',function($query){
$query-&field("min(ss_cprice) as ss_cprice,ss_sa_id")-&where("ss_number & 0")-&group('ss_sa_id');
3.延时加载
基本用法:
$test1 = D("Test1");
$test1-&where(array('id'=&1))-&find();
print_r($test1-&test2);
带过滤条件:
$test1 = D("Test1");
$test1-&where(array('id'=&1))-&find();
$rs = $test1-&has('test3',function($query){
$query-&where('id &= 2');
4.其他扩展和优化
$field,$vales
简化in查询,$filed:查询字段,$valus:数组           
$conditions
在原有where方法的基础上加入了别名识别,即原模型的$_map属性的识别
将别名映射为对应的数据库字段
isDirty  
检查模型的属性是否修改,只对使用了find方法的单条数据有效
获取修改过的字段,只对使用了find方法的单条数据有效
优化原有的保存方法,在原有基础上加入脏检查
排除那些字段不查询,可接收多个参数
$test1 = D("Test1");
$test1-&where(array('id'=&1))-&find();
$test1-&name = "222222";
var_dump($test1-&isDirty('name'));
print_r($test1-&getDirty());
$test1-&save();
需要特别注意的是,在我们使用field等类似方法过滤字段的时候,记得一定要查询关联字段,否则关联查询会出错,其次在关联字段上进行查询过滤的时候,不要使用数组的形式,原因是TP在where时会使用array_merge合并条件,而我在处理关联查询时会使用关联字段进行in查询,并在这里我是用数组的形式写的,如果有需要可以将此处改为字符串形式,则可以解决该问题
下面说说查询的思路:
所有查询都是在主表先完成查询,之后获取主键,再去关联表做in查询,然后在PHP中合并结果,所以使用关联查询也有它的局限性,当我们需要关联表做条件过滤主表数据的时候,关联查询便不太适用.
SQL: SHOW COLUMNS FROM `test1` [ RunTime:0.002687s ]
SQL: SELECT * FROM `test1` WHERE ( `id` = 1 ) LIMIT 1
[ RunTime:0.000425s ]
SQL: SHOW COLUMNS FROM `test3` [ RunTime:0.002623s ]
SQL: SELECT * FROM `test3` WHERE ( id & 2 ) AND ( `test1_id` IN ('1') )
[ RunTime:0.000405s ]
SQL: SHOW COLUMNS FROM `test1` [ RunTime:0.001573s ]SQL: SELECT * FROM `test1`
[ RunTime:0.000262s ]SQL: SHOW COLUMNS FROM `test2` [ RunTime:0.001488s ]SQL: SELECT * FROM `test2` WHERE ( `test1_id` IN ('1','2','3','4','5') )
[ RunTime:0.000313s ]
阅读(...) 评论()thinkphp5 模型关联的bug - CSDN博客
thinkphp5 模型关联的bug
用tp5的模型关联时发现一个bug。为了输出关联模型的字段,有两种写法,一种是5.0.4以上版本才支持的bind(‘xxx’),另一个中是
field(‘xx’)
bind写法如下
public function images()
return $this-&hasOne('FbPostImage','object_id', 'object_id')-&bind('images');
public function testMultiPostImages()
$FbPostModel = new FbP
$posts = $FbPostModel::all(function ($query) {
$query-&field('page_id,post_id,message,post_type,post_time_hk as publish_time,permalink_url as post_url, source, object_id')
-&where('sync_status', 0)-&order('update_time', 'desc');
$result = collection($posts)-&hidden(['object_id'])-&toArray();
return $result;
上述输出结果没有images。bind加上object_id也一样。没有输出images.。但是如果将$posts 遍历输出子post的images对象,是有值的。
field写法如下
public function images()
return $this-&hasOne('FbPostImage','object_id', 'object_id')-&field('images,object_id');
public function testMultiPostImages()
$FbPostModel = new FbP
$posts = $FbPostModel::all(function ($query) {
$query-&field('page_id,post_id,message,post_type,post_time_hk as publish_time,permalink_url as post_url, source, object_id')
-&where('sync_status', 0)-&order('update_time', 'desc');
}, 'images');
$result = collection($posts)-&hidden(['object_id'])-&toArray();
return $result;
用field 写法,再手动指定输出关联模型输出field,可以输出images。
可能这个也是tp5的bug
本文已收录于以下专栏:
相关文章推荐
CakePHP最强大的特性之一是能够提供的链接关系映射模型。在CakePHP中,模型通过协会之间的联系。
定义在应用程序中不同对象之间的关系应该是一个自然的过程。例如:在配方数据库,导致可能...
一、关联模型
在关系型数据库中,表之间有一对一、一对多、多对多的关系。在 TP5 中,实现了ORM (Object Relational Mapping) 的思想,通过在模型中建立模型间的关联,实现建...
下面我们以一个实例来讲述关联操作的简单用法,由于关联操作定义复杂,这里只是讲述一般的情况。我们以用户表为核心,来描述如何使用表的关联操作。假设存在如下的关联情况:
每个用户有一个档案表是HAS_ONE...
/tpshop/thinkphp5/228987
完全开发手册:/manual...
关联模型的使用
在数据表中一般会存在三种关联关系:
通常我们所说的关联关系包括下面三种:
²  一对一关联  :ONE_TO_ONE,包括HAS_ONE
²  一对多关联  :ONE_TO...
需要对省市区 三张表进行查询,将查询结果 进行组装成如下格式,便于前段js调用
array (size=34)
array (size=4)
'id' =& int...
1.getPk 会把primary的键都查询出来2.使用模型关联时,最好把主键名参数写上
如题:使用模型关联时,最好把主键名参数写上
使用的是 TP5.0.9
在 Model   中设置  表1  ...
模型和关联操作:表对应一个模型、字段对应一个属性操作类的对象时就等于操作某一张表的记录命名规则:指定类名对应指定数据表名下划线的标明对应驼峰式命名的类如果类名和标明不相关,但是想操作那张表:那么可以用...
学习内容及参考:
/tpshop/thinkphp5/228855
完全开发手册:/manual...
关联模型一对多增加数据
增加数据后效果如下
把id为1的张三
的content修改为hello
thinkphp 关联模型 一对多数据更新时
一定在新增的部分...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 tp5事务处理有什么用 的文章

 

随机推荐