PHP框架每张表对应一个model的意义何在

很多框架中,每张表对应一个model,我们一般会在MVC中增加service层用来处理业务逻辑,为什么不在service层直接操作db类

框架这么做(每张表对应一个model)的优势在哪里
谢谢诸位

回复
阅读 4.2k
5 个回答

目前说三个热门框架吧,国外的 Laravel 和 Symfony 以及或内的 ThinkPHP 5 三个,这三个中都没有所谓的 Service 层的,service 都是开发者自己写的。而 这三个框架中 Model 最主要的意义是为了定义数据关系,换句话说,就是为了定义表和表之间的关联关系。例如 Laravel 中,一个用户是 User 模型,对应 users 表,还有一个 Post 模型,对应 posts 表,在 posts 表中有一个 user_id 字段对应的 users.id 字段。所以可以在 User 模型中第一一个方法:

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

这样例如我们拿到了一个用户模型在 $user 中。我们想读取这个用户的 posts 传统的需要进行查询。而在 Model 中,我们只需要调用 $user->posts 就拿到了,本质上也是查询过程。

只是这种模式中,把数据间的关系从代码上更加显得有关联性了。

总结各大框架,只有一句话,模型层和每张表都需要对应一个相对应的模型,最核心的目的就是为了简化表操作 然后没有然后了
在衍生一下这句话 也就是说,如果你已经习惯了使用框架,那么模型层的这种做法只是需要配置的几下的问题,省却了很多后顾之忧,所谓的意义也就是这些,用简单的方式和少量的时间去实现复杂的内容。

可以这么说,很多框架都明确规定了,需要一张表对应一个模型的提倡,其实最终的目的也就是优势,也是需要你了解的所在。
如果你真的有所了解,那框架是真的可以让你省力气的,不管在模型中如何抛出异常,如何使用钩子或者行为 或者事件,再或者中间件,我们都可以从容的实现代码的逻辑,当然有个前提就是你必须会那些我说的原理和逻辑,不然白搭。

我虽然也处于框架学习阶段,但是我却是知道,这些方式写代码,我再也不用在控制器里面考虑过于复杂的接口逻辑了,
中间件解决了我的基础验证问题,验证器解决了我的各种类型验证问题,行为钩子解决了我的存储问题,通用事件同样解决了用户整体架构的事件问题。
最后模型事件让我在模型层操作在也不用写一大堆的东西 只需要专注的进行本来想要操作的主表,其他的东西 均在插入前插入后 添加前添加后之类的地方任意做处理,说真的这其实是一件比较幸福的事情,应为再也不用操劳过度的写这个写那个了。
代码质量也出奇的高了许多,而且不管是对接口开发 还是对混合模式开发 我都变得可以游刃有余的控制我的功能和实现方式 并且相应的不管怎么搭建,我们只需要处理的地方也变得越来越少了,然而实现的代码能力却越来越强,一切都为后台提供了超强的便利条件,那么模型层对印表 是不是就很牛逼了呢。我认为是的,至少在我没有接触到更牛逼的东西之前,这个暂时还未被超越。

就拿 Laravel 举例来说像:

等。个人建议 Model 就是用来维系这些的。
查询构建器 这些则应当放到 Repository ,像类似于 用户登录 这种属于业务逻辑的 就应该放到 Service

为每个层级划定责任内容,更利于单一职责。

Model

以Laravel 为例,Laravel 的 Model 叫 Eloquent ORM
以下是百度百科对ORM的解释

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 [1] 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

在实际应用中,数据库中每一个表对应一个类,而类的实例对应数据库表中的一行记录,数据库中的列对应实例的属性。
同时Model还可以定义与其它Model的关联关系,即数据库表之间的关联关系。
laravel model 实现了软删除,查询作用域,事件,访问器,修改器等功能

为什么不在service层直接操作db类。

如果只是从对数据库的操作结果来看,通过db或model,结果都是一样的,没有区别。
但是Model会更便利,其次它统一了表操作入口,再就是更面向对象
具体有哪些好处或便利,建议楼主去看框架Model的源码

关于Service层

laravel 中 Service层 链接描述

The Services directory contains various "helper" services your application needs to function. For example, the Registrar service included with Laravel is responsible for validating and creating new users of your application. Other examples might be services to interact with external APIs, metrics systems, or even services that aggregate data from your own application.

ThinkPHP中的Service层 链接描述

图片描述

就是简单明了。尽量不直接操作表,而是封装方法,这样比较可控

推荐问题
宣传栏