「七天自制PHP框架」第四天:模型关联
往期回顾:「七天自制PHP框架」第三天:PHP实现的设计模式,点击此处
原文地址:http://www.cnblogs.com/sweng/p/6624845.html,欢迎关注:编程老头
前阵子在网上关心一个话题:对于一个PHP程序员,或者Java程序员,或者C#程序员,怎么区分3年,5年,10年工作经验?工作经验是否和薪资成正比?
个人认为:无论擅长哪一种语言,都不要把自己绑在一种语言上,更不要做一个代码的搬运工。平时每写完一个项目,都留出充足的时间去思考“还有什么地方可以改进”,相信即使1年的工作经验,也会有3年工作经验的收获。
最近我在思考一个问题:平时做PHP项目常常要和“新闻发布”,“博客评论”打交道,而每一次写功能都会重写“相似”的代码,如果能够把这一块代码做好重用,以后只需修改几个参数就能用在另一个项目,就可以很短时间完成一个功能。
当然使用PHP框架,会让你工作效率得到成倍的提升,但是,你的学习成本也就跟着上去了。
最初使用Laravel框架的时候,觉得Eloquent的语法实现得很美,比如:
$comments = App\Post::find(1)->comments;
foreach ($comments as $comment) {
//
}
这里继续我们上一节讲的,怎么做模型关联。
模型,简单点说,就是把数据库中这么多表抽象成若干个对象,使得开发的过程中,不用再关心数据表的结构,而是专心类和对象的设计。
就拿在微信朋友圈发消息来说,这里涉及到了3个对象:消息(纯文字,图片,或者图文),点赞,评论。

根据这个图,我们设计三个类:
class MessageModel extends Model{
public static $data;
public static $name;
public $messageid;
public function __construct(){
parent::__construct();
$this::$name='message_list';
$this::$table='message';
}
}
class LikeModel extends Model{
public static $data;
public static $name;
public $likeid;
public function __construct(){
parent::__construct();
$this::$name='like_list';
$this::$table='messagelike';
}
}
class CommentModel extends Model{
public $commentid;
public function __construct(){
parent::__construct();
$this::$name='comment_list';
$this::$table='reply';
}
}
这是典型的“一对多”的模型,也就是一个Message对象对应了多个Like对象和Comment对象,而一个Like对象或者Comment只对应了一个Message对象。
有人说,为什么不用SQL中的where或者join来查询?
因为我实在厌倦了拼接SQL,实在太无趣了。
关键是查询完得到的多维数组,还需要写一段代码来组装成对象数组,让我不得不思考怎么避免这低效劳动。
我的方案是每一个Model都实现这样的接口,让你尽量少写select
public static function get($id){
return self::where('id',$id);
}
public static function where($condition,$value){
$sql=sprintf("select * from %s where %s='%s'",self::$table,$condition,$value);
return self::$db->Query($sql);
}
public static function first($num){
$sql=sprintf("select * from %s limit %s",self::$table,$num);
return self::$db->Query($sql);
}
public static function all(){
$sql=sprintf("select * from %s",self::$table);
return self::$db->Query($sql);
}
那如果要实现一对多,怎么办?Laravel使用了trait特性,让Model来use这个特性。
这里我们简单的做一个函数:
public function HasMany(Model $model,$foreignkey){
for($i=0;$i<count($this::$data);++$i){
$this::$data[$i][$model::$name]=[];
for($j=0;$j<count($model::$data);++$j){
if($this::$data[$i][$foreignkey]==$model::$data[$j][$foreignkey]){
array_push($this::$data[$i][$model::$name],$model::$data[$j]);
}
}
}
}
对于三张数据表:Message,Like,Comment来说,Message的主键是msgid,而msgid同时也是Like和Comment这两张表格的外键,靠着外键,三张表形成了一对多的关系。
所以凭借这样的一个关联数组的操作,我们把Like和Comment数组作为一个关联数组的Value塞入Message数组中的一个元素。
最后我们测试一下效果:
$messageModel=new MessageModel();
$messageModel::$data=$messageModel::all(); $likeModel=new LikeModel();
$likeModel::$data=$likeModel::all(); $commentModel=new CommentModel();
$commentModel::$data=$commentModel::all(10); $messageModel->HasMany($likeModel,'msgid');
$messageModel->HasMany($commentModel,'msgid'); echo json_encode($messageModel::$data);
我们最后使用JSON格式输出,结构一目了然,给前端调用也很便利。

「七天自制PHP框架」第四天:模型关联的更多相关文章
- 「七天自制PHP框架」第二天:模型与数据库
往期回顾:「七天自制PHP框架」第一天:路由与控制器,点击此处 什么是模型? 我们的WEB系统一定会和各种数据打交道,实际开发过程中,往往一个类对应了关系数据库的一张或多张数据表,这里就会出现两个问题 ...
- 「七天自制PHP框架」第三天:PHP实现的设计模式
往期回顾:「七天自制PHP框架」第二天:模型与数据库,点击此处 原文地址:http://www.cnblogs.com/sweng/p/6624845.html,欢迎关注:编程老头 为什么要使用设计模 ...
- 「七天自制PHP框架」应用:JSON生成器
刚刚开始学做一个WebAPP,数据查询的一般套路是通过一张PHP页面读取数据库,获得列表后“嵌写”在PHP页面中,虽然写法上丑陋至极,但也有“快糙猛”出效果的成就感,如图. 后来想想,不对啊,难道以后 ...
- 「七天自制PHP框架」第一天:路由与控制器
我们为什么要使用路由? 原因1:一个更漂亮的URI 1.URI的改进 刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数.这样的URI有两个缺点,一是容易被 ...
- 「七天自制PHP框架」应用:Model外键链接
这里以行政区数据为例: 一级行政区数据范例: 二级行政区范例: 三级行政区范例: 在Model层建立三个Model class ProvinceModel extends Model{ public ...
- 「7天自制PHP框架」第一天:路由与控制器
我们为什么要使用路由? 原因1:一个更漂亮的URI 1.URI的改进 刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数.这样的URI有两个缺点,一是容易被 ...
- 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾
「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...
- Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」
1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...
- 「拥抱开源, 又见 .NET」系列第三次线下活动简报
「拥抱开源, 又见 .NET」 随着 .NET Core的发布和开源,.NET又重新回到人们的视野. 自2016年 .NET Core 1.0 发布以来,其强大的生命力让越来越多技术爱好者对她的未来满 ...
随机推荐
- Python之返回函数
高阶函数可以把函数作为一个结果值返回 举例说明 普通的求积函数是 vim day5-6.py #!/usr/bin/python # -*- coding:utf-8 -*- def product( ...
- java基础---->hashMap的简单分析(一)
HashMap是一种十分常用的数据结构对象,可以保存键值对.它在项目中用的比较多,今天我们就来学习一下关于它的知识. HashMap的简单使用 一.hashMap的put和get方法 Map<S ...
- Java学习笔记——排序算法之简单排序
男儿何不带吴钩,收取关山五十州.请君暂上凌烟阁,若个书生万户侯? --南园十三首 三种排序法: 1.冒泡法 2.简单选择法 3.直接插入法 上代码: 1.冒泡排序 public class Bub ...
- 你真的用好了Python的random模块吗?
random模块 用于生成伪随机数 源码位置: Lib/random.py(看看就好,千万别随便修改) 真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结 ...
- <<、>>、>>>移位操作
<<,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐. int leftShift = 10; System.out.println("十进制:" + l ...
- web.xml报错
The content of element type "web-app" must match "(icon?,display-name?,description?,d ...
- SQLServer树形数据结构的数据进行数据统计
前言 前几天朋友问我,关于SQLServer数据库中对树形结构的表数据统计问题,需求大致如下: 分类表(递归数据),A的子分类是B,B的子分类是C--分类关系不间断,A为第一层,B为第二层,C为第三层 ...
- mac系统下给文件夹加密方法
电脑里我们往往会有许多隐私的文件,不希望被别人看到,在过去的Windows电脑里,我们习惯性的会在文件夹中将该文件隐藏,但是这个隐藏是不安全的,遇到稍微会点电脑技术的人就可以给你解开,安全性不高,ma ...
- JQuery模拟实现天猫购物车动画效果
测试程序源代码下载地址:源码 一.功能描述: 1.点击购买按钮,模拟抛物线将物品弹到购物车里: 2.购物车添加物品后,显示+1动画: 效果图如下: 实现如下: 1.导入jquery相关的包: < ...
- [问题贴]mui.openWindow+自定义事件监听操作让alert()执行两次
仔细看,Alert函数执行了两次 共两个页面:index.html和detail.html, detail.html为按钮设置了自定义事件监听(newsId),触发alert. 在index.html ...