往期回顾:「七天自制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框架」第四天:模型关联的更多相关文章

  1. 「七天自制PHP框架」第二天:模型与数据库

    往期回顾:「七天自制PHP框架」第一天:路由与控制器,点击此处 什么是模型? 我们的WEB系统一定会和各种数据打交道,实际开发过程中,往往一个类对应了关系数据库的一张或多张数据表,这里就会出现两个问题 ...

  2. 「七天自制PHP框架」第三天:PHP实现的设计模式

    往期回顾:「七天自制PHP框架」第二天:模型与数据库,点击此处 原文地址:http://www.cnblogs.com/sweng/p/6624845.html,欢迎关注:编程老头 为什么要使用设计模 ...

  3. 「七天自制PHP框架」应用:JSON生成器

    刚刚开始学做一个WebAPP,数据查询的一般套路是通过一张PHP页面读取数据库,获得列表后“嵌写”在PHP页面中,虽然写法上丑陋至极,但也有“快糙猛”出效果的成就感,如图. 后来想想,不对啊,难道以后 ...

  4. 「七天自制PHP框架」第一天:路由与控制器

    我们为什么要使用路由? 原因1:一个更漂亮的URI 1.URI的改进 刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数.这样的URI有两个缺点,一是容易被 ...

  5. 「七天自制PHP框架」应用:Model外键链接

    这里以行政区数据为例: 一级行政区数据范例: 二级行政区范例: 三级行政区范例: 在Model层建立三个Model class ProvinceModel extends Model{ public ...

  6. 「7天自制PHP框架」第一天:路由与控制器

    我们为什么要使用路由? 原因1:一个更漂亮的URI 1.URI的改进 刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数.这样的URI有两个缺点,一是容易被 ...

  7. 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾

    「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...

  8. Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」

    1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...

  9. 「拥抱开源, 又见 .NET」系列第三次线下活动简报

    「拥抱开源, 又见 .NET」 随着 .NET Core的发布和开源,.NET又重新回到人们的视野. 自2016年 .NET Core 1.0 发布以来,其强大的生命力让越来越多技术爱好者对她的未来满 ...

随机推荐

  1. 通过js来设置cookie和读取cookie,实现登陆时记住密码的功能

    function setCookie(){ //设置cookie var loginCode = $("#login_code").val(); //获取用户名信息 var pwd ...

  2. hammer的初始化及移动端各种滑动

    前言:本人对hammer了解不是很多,早做项目时遇到了手机端的一些滑动事件,特此分析下hammer的某些属性. hammer.js是一款开源的移动端脚本框架,他可以完美的实现在移端开发的大多数事件,如 ...

  3. Win10更新补丁失败后出现无法更新正在撤销 解决办法

    系统更新失败,反复重启还是不行,那是不是下载下来的补丁没用了呢??所以我们先要删除Windows更新的缓存文件!在做以下操作之前,首先我们要确认系统内的windows update & BIT ...

  4. 在Windows中单机环境下创建RabbitMQ集群

    本文根据:http://www.360doc.com/content/15/0312/17/20874412_454622619.shtml整理而来 RabbitMQ具有很好的消息传递性能,同时又是开 ...

  5. 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

    0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...

  6. 写给Android App开发人员看的Android底层知识(2)

    (五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...

  7. Day2-文件操作

    文件操作流程: 1.打开文件,得到文件句柄并赋值给一个变量: 2.通过句柄对文件进行操作: 3.关闭文件 ################################33 1.打开文件方法: a. ...

  8. Lua 设置table为只读属性

    项目中部分只读表易被人误改写,故决定在非线上环境里对这些表附加只读属性,方便在出现误改写的时候抛出lua错误,最终版代码如下: --[[-------------------------------- ...

  9. 移动端H5通用表单验证插件

    将表单验证的通用部分提炼出来,做成一个简易插件,方便调用. 已将源码放到GitHub上,名字叫zValidate. 手机可扫描下图查看示例,PC端可点击此处查看: 一.原理 1)需要引入zepto.j ...

  10. (转)Java 读写Properties配置文件

    原文:http://www.cnblogs.com/xudong-bupt/p/3758136.html 1.Properties类与Properties配置文件 Properties类继承自Hash ...