还记得第一次用ThinkPHP的relation,做了一个关联查询,觉得特别好用。有那么一天尝试着用关联插入,怎么插,都插不进,我插,我擦!

后来在龙哥的指点下算是成功的实践了一次,后来怎么用都不顺,后来变远离了 relation,便觉得这是TP 本身的问题,却不知是自己没有找到问题的症结,还是编程届

的那句谚语说的好,你没有了解出现问题的真正原因,就不算解决了BUG。

最近公司做接口,两张表一对多的关系, 正常查询的话(select tag.*, evaluate.* from tbl_tag as tag,tbl_evaluate as evaluate where(tag.tag_id = evaluate.tag_id))是多条记录,而需要返回如下的JSON数据:

{"ret": "0","msg": "ok","data": [{"tag_id": "1226","name": "软件故障类","type": "1","Icon": "/style/images/sortImgs/small/","created_at": "1373383665","status": "1","explain": "暂无","changed_at": "1373383665","evaluate_count": "5","contents_type": "1","process_id": null,"evaluate": [{"evaluate_id": "4","tag_id": "1226","name": "任务创建时间","limit_time": "0","alert_time": "0","position": "1","description": null,"isfixed": null,"status": null,"remark": null},{"evaluate_id": "5","tag_id": "1226","name": "任务分配时间","limit_time": "10","alert_time": "5","position": "1","description": null,"isfixed": null,"status": null,"remark": null},{"evaluate_id": "6","tag_id": "1226","name": "任务领取时间","limit_time": "15","alert_time": "3","position": "1","description": null,"isfixed": null,"status": null,"remark": null},{"evaluate_id": "7","tag_id": "1226","name": "任务开始时间","limit_time": "60","alert_time": "20","position": "1","description": null,"isfixed": null,"status": null,"remark": null},{"evaluate_id": "8","tag_id": "1226","name": "任务结束时间","limit_time": "240","alert_time": "30","position": "1","description": null,"isfixed": null,"status": null,"remark": null}]},{"tag_id": "1229","name": "改进后的任务我22","type": "1","Icon": "/style/images/sortImgs/small/","created_at": "1373700085","status": "1","explain": null,"changed_at": "1373700979","evaluate_count": "5","contents_type": "1","process_id": null,"evaluate": [{"evaluate_id": "10","tag_id": "1229","name": "时间1","limit_time": "11","alert_time": "6","position": "1","description": null,"isfixed": null,"status": null,"remark": null}]},{"tag_id": "1230","name": "维修任务修改2","type": "1","Icon": "/style/images/sortImgs/small/","created_at": "1373714061","status": "1","explain": null,"changed_at": "1373715337","evaluate_count": "2","contents_type": "1","process_id": null,"evaluate": [{"evaluate_id": "11","tag_id": "1230","name": "执行时间1","limit_time": "4","alert_time": "3","position": "1","description": null,"isfixed": "1","status": "1","remark": null},{"evaluate_id": "12","tag_id": "1230","name": "执行时间1","limit_time": "5","alert_time": "4","position": "2","description": null,"isfixed": "1","status": "1","remark": null}]}]
}

阅读别人的代码的时候,发现TP的  relation能返回这样的数据,好了,躲不掉的Relation

马上我就又凌乱了,之前的TP直接继承RelationModel,关联查询  so  easy, 关键是公司继承了BaseModel,各种研究,各种陌生

/*** 通过id查询标签*/
public function show(){//自动校验$dr_tag=D('Tag');$condition=$dr_tag->create($_GET);if( false === $condition) exit(RS::jsonReturn($dr_tag->getError()));$dr_process = D('Process');$dr_process = $dr_process->switchModel ( 'Relation' );$linklist = ProcessModel::get_link ( 'this' );$dr_process->setProperty ( '_link', $linklist );$field = TagModel::getObjFields ( 'this' );$tags_id=$condition['tags_id'];$name=$condition['name'];$explain=$condition['explain'];if(empty($tags_id) && empty($name) && empty($explain)) exit(RS::jsonReturn("20001"));//查询条件if (!empty ( $tags_id)) $where ['tbl_tag.tag_id'] = array ('eq', $condition['tags_id'] );if (!empty ( $condition ['name'] )) $where ['tbl_tag.name'] = array ('eq', $name );if (!empty ( $condition ['explain'] )) $where ['tbl_tag.explain'] = array ('like','%'.$explain.'%');$where['tbl_tag.tag_id'][]=array('neq',999);$field[] = 'tbl_tag.tag_id';$field[] = 'tbl_tag.name';$field[] = 'tbl_tag.type';$field[] = 'tbl_tag.status';$field[] = 'tbl_tag.Icon';$field[] = 'tbl_tag.created_at';$field[] = 'tbl_tag.changed_at';$field[] = 'tbl_tag.explain';$field[] = 'tbl_tag.contents_type';$field[] = 'tbl_tag.process_id';$field[] = 'tbl_process.process_count';$data = $dr_process->field ( $field )->join ( 'right join tbl_tag ON tbl_tag.process_id = tbl_process.process_id' )->where ( $where )->relation ( true )->find();//返回数据if(empty($data)) exit(RS::jsonReturn("20000"));echo RS::jsonReturn("0",$data,"ok");}

照猫画虎,自己来一个,尽管搞不明白:

$linklist = ProcessModel::get_link ( 'this' );
$dr_process->setProperty ( '_link', $linklist );
//关联,显示所有任务类型和指标详情
protected function tagsShow_link(){
return array(
'evaluate'=>array(
'mapping_type' => HAS_MANY,
'class_name'=>'Evaluate',
'foreign_key'=>'tag_id',
//'mapping_name' =>'indexs',
'mapping_fields_name' =>'this'
),
);}/* 返回字段 */
public static function tagsShowObjFields(){
$ObjFields = self::$allObjFields;
foreach ($ObjFields as $key=>$val){
if('notifications_enabled' === $val) unset($ObjFields[$key]);
}
return $ObjFields;
}

结果就是出不来结果,Relation不出来,出来的就是关联的是false

源于不明白这个get_link和  setProperty总是以为是这里出了批漏,各种查,各种对比,各种纠结,一个人,在周六

$linklist = ProcessModel::get_link ( 'this' );
$dr_process->setProperty ( '_link', $linklist );

找到了一条靠谱的解决方法,是改RelationModel下面的M 方法为D ( http://lhdeyx.blog.163.com/blog/static/318196972010112351516763/),我打开一看,晕死了,就是D;

之前都是在物理上实现外键约束的,现在是在逻辑上实现,以为Relation关联不上错在这里,实际上是无关的

无奈了,最后,想SQL语句,一开始就想到了,下面的,觉得可行,就是效率太低,PASS

$tag = D('Tag');$evaluate = D('Evaluate');$tag_ids = $tag->getField('tag_id,name');if(isset($_GET['since_at']) && !empty($_GET['since_at'])){$since_at = $_GET['since_at'];$condition['changed_at'] = array('gt',$since_at);}//echo $tag->getLastSQl();die();foreach($tag_ids as $key=>$val){$map['tag_id'] = array('eq',$key);$condition['tag_id'] = array('eq',$key);$result = $tag->where($condition)->find();$res = $evaluate->where($map)->select();$result['indexs'] = $res;$data[] = $result;}//返回数据if(empty($data)) exit(RS::jsonReturn("20000"));echo RS::jsonReturn("0",$data,"ok");

后来就google大神,论坛,以至于差点用起了行列转换

--行列转换模型
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理
from tb
group by name

纠结在继续,

在sql搞不定之后,回到了Relation,还是搞不定,夜很静了,我只能简单粗暴了,一开始的sql.

…………

方姐,来了,观察了一下情况,该有的都有了,于是

$data = $dr_tag->relation(true)->select();
$evaluate = D('Evaluate');echo $evaluate->getLastSql();die('dd');

我一下就反映过来了,告诉TA是limit_time,后来改了Model中的字段

sudo rm -rf  *,TA迷人的样子让我折服,轻轻的在我耳边说,该了Model要删缓存,Ta 说的那么轻描淡写,我觉永远记住了

我之前也

echo $dr_tag->getLastSql();die('dd');提示的错误让人更纠结。回想Ta 解决BUG缜密思路,我…………
提示你false, 我永远都不知道用被关联的表evaluate实例化后输出,直到Ta 展示给我
爱上了Relation,  爱上……

转载于:https://www.cnblogs.com/jiangu66/p/3194110.html

[置顶] 让我爱恨的ThinkPHP Relation相关推荐

  1. 百度编辑器在服务器置顶路径 解决上传图片创建目录失败的方法(Thinkphp)

    百度编辑器在服务器置顶路径 解决上传图片创建目录失败的方法(Thinkphp) 参考文章: (1)百度编辑器在服务器置顶路径 解决上传图片创建目录失败的方法(Thinkphp) (2)https:// ...

  2. 细数社交巨无霸Facebook与美国媒体的“爱恨情仇”

    前言 "你可以远眺窗外,凝视丹佛的落基山脉.它巍峨壮观的山峰似乎亘古不变,但在风雨的打磨与地壳的碰撞中,实际上山体时时刻刻都在发生变化.新闻行业也一样,商业模式和读者的阅读习惯也在潜移默化重 ...

  3. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...

  4. 阅读目录(置顶)(长期科技领域知识)

    第一期:适用于数据项目的7种强大的开源工具 第二期:四种正确的微服务部署方式 第三期:开源和赚钱何去何从 第四期:Web前端和Java开发哪个薪资更高,发展前景更好? 第五期:干货总结:中级前端工程师 ...

  5. android imageview 锯齿,[置顶] android 自定义圆角ImageView以及锯齿的处理

    看到很多人开发过程中要使用圆角图片时,解决方法有: 1.重新绘制一张图片 2.通过布局来配置 3.通过重写View来实现 其中1,2在这里就不讲了,重点讲讲方法三的实现. 实现一:通过截取画布一个圆形 ...

  6. 借华为鸿蒙系统发布,谈谈操作系统的爱恨情仇发展史

    2019.08.09,华为在其全球开发者大会上,正式向全球发布了全新的自有系统 HarmonyOS 鸿蒙--基于微内核的面向全场景的分布式操作系统.余承东在现场表示, HarmonyOS 鸿蒙拥有分布 ...

  7. 博主文章导航(分门别类,实时更新,永久置顶)

    恒叨立码 :: 包括 理论恒叨 系列与 码上实战系列,一个算法,从理论到编码,博主悉心教学.恒叨立马,见功力也. :: 恒叨立码,是为大将军! :: 将军,请上码! 此博客的目的是做一个博文中转站.博 ...

  8. 在andriod手机上video视频播放时自动置顶自动全屏的问题

    问题:h5开发人员在做直播的时候,会发现视频在播放的时候会置顶,文字什么的根本加不上去 查了很多资料,有人说用样式层级方法,有人说用canvas画布来实现,反正我是没实现 也查看了各大视频APP分享到 ...

  9. android烧号工具,让你“爱恨交加”的

    让你"爱恨交加"的EVO 4G 待机那点事儿 1500毫安电池 前面我们说了这些强大的功能,下面是不是该老生常谈的待机时间问题了.这款HTC EVO 4G内置了1500毫安的电池, ...

最新文章

  1. JavaEE——JavaScript
  2. Python面向对象编程:深度认识类class
  3. Java与邮件系统交互之使用Socket验证邮箱是否存在
  4. 等值线在Google Map上的叠加Extent
  5. oracle pl/sql 中目录的创建
  6. phpredisadmin common.inc.php,phpRedisAdmin安装
  7. 项目管理中的流程管理
  8. 【目标检测】CNN的训练图像与测试图像不一致的多尺度问题
  9. 桌面程序 取色器 colors.exe
  10. AD元器件英中名称对照【Ctrl + F 快速查找元器件英文名称】
  11. 计算机cpu在哪,cpu什么意思啊_电脑cpu哪里看
  12. Jsonp解决跨域问题原理
  13. Windows系统通过命令行查看无线网络密码的三种方式
  14. 打游戏经常有人喷,刷个B站还是有?Python实现在网站上自动评论!键盘侠都喷不赢你!
  15. 传媒论坛杂志传媒论坛杂志社传媒论坛编辑部2022年第13期目录
  16. 开博记念及附上第一个android工程:Txt文本阅读器
  17. 独立显卡、核心显卡和集成显卡的区别
  18. 科学计数法转为普通计数法
  19. Windows Server 2008 防火墙开放 Oracle 的1521端口
  20. 时间管理软件 压力测试软件JMeter 微信小程序可视化代码生成 黑客网站

热门文章

  1. ActionBar(3):搜索条
  2. android UI开源库
  3. 1002-487-3279*北京大学acm-oj-java语言题解
  4. mysql 单块读 多块读_求指点:STM32F103VC的SDIO读SD卡单块读成功,多块读却不行?...
  5. 探秘:TriCore处理器中断机制
  6. hive 优化(二)
  7. (77)FPGA时序违例及解决办法-面试必问(一)(第16天)
  8. (30)FPGA原语设计(单端时钟转差分时钟)
  9. 移动端安全测试主要涉及_Android APP安全测试基础
  10. STM32 定时器输出pwm的频率计算方法 PWM 频率检测方法 直流电机的位置控制