PHP 的 sql 到底该写在哪儿?

2020-04-13 18:17:18 +08:00
 taaaang

最近刚接触 PHP,过了一遍 PHP 官方文档和 thinphp 的官方文档就开干。然后用到原生 sql,不知道正常情况应该写在哪儿更合适,controller ? 还是单独整一层? 或者一起放在 model 里面? 求大佬们指点下,怎么搞看起来专业一点。。。

8044 次点击
所在节点    PHP
66 条回复
tabris17
2020-04-14 08:52:26 +08:00
没必要抽象出 dal,事实上项目是不可能切换数据库的
taaaang
2020-04-14 09:05:15 +08:00
@chotow @m939594960 @sagaxu @Takamine @heyjei @hbolive
首先感谢大佬们的围观。
如果用 service 来封装共用逻辑,你们怎么命名文件的呢? 类似于 java 的 xxxService ? 我想既然干 php 就得像 php 。 大部分时候 model 够用,主要是有一些原生 sql 写在 controller 里面,代码文件显得很长了,也确实有一些逻辑需要抽取出来。

我居然因为一个代码组织的问题来专门提个问题,也真是心累了。。。
AlanLeung2018
2020-04-14 09:11:08 +08:00
tp 框架,建议写在 model 层
jfhy0901
2020-04-14 09:18:25 +08:00
一般都是写在 C 里面,M 里面做一些关联模型等。兼职不要讲究那么多,我接手的一个项目,一个 C 里面写了一万行你敢信?
zjsxwc
2020-04-14 09:19:15 +08:00
有 ORM 就按照 ORM 推荐的用法来写,sql 写在 Repository 和 Entity 里都可以,一般都是类 sql 的方言比如 linq 、dql 等,反正都是 Entity 实体对象处理,entity manager 会自动搞定。

如果是类似 mybatis 的框架 sql 就写到 mapper xml 文件里,花点时间自己手动构造每个 DAO 。

其他比如 PDO 这种全局变量的,哪里都能写,你安自己项目需求写呗,只要合理就行。
guolaopi
2020-04-14 09:19:17 +08:00
@emeab
我瞎说的啊,我不做 PHP,只是给我的感觉像充血模型一样
edk24
2020-04-14 09:19:31 +08:00
用 sql 少, 我觉得可以写在 controller 里, 但这个 sql 常用到可以写在 model 方便复用
handsomehaitao
2020-04-14 09:19:57 +08:00
service 与 response 里
encro
2020-04-14 09:24:55 +08:00
一般不用写 sql 了吧,复杂查询用 orm 自动关联出来。

如果需要对一些操作进行封装,比如对多个批量操作采用事务,可以写在 model,便于复用。

其实不用太在乎写在哪里,而应该在乎是否好用好用,便于用即可,实际写写看。

比如用户充值,需要修改余额和生成充值记录,那么直接用$user->recharge($money)我觉得是比较方便和复用的,那么对我来说就是适合的,
因为如果写在控制器里面,那么不能复用,
如果单独抽取 service 层,你用的时候就得 UserService::Recharge($user_id,$money),UserService 里面你得再次实例化 User,当然你也可以直接传$user 进去,但是我懒。
代码怎么简单明了够用就怎么写吧,大部分时候代码行数越少就越容易维护。
m939594960
2020-04-14 09:39:50 +08:00
一般的项目,一般我就写到 controller 或者 service 里了
absolutelynull
2020-04-14 09:40:31 +08:00
数据处理的话 可以写在 model 层,单纯的 crud 的话 实例化模型在 controller 写入
Varobjs
2020-04-14 09:50:10 +08:00
写在哪里都可以,
如果简单的, 写 c 里也行吧,如果多处用,就写 service 里,如果很多 service 用,那就再单独一层
brader
2020-04-14 09:50:58 +08:00
用 php 框架就尽量不要写原生 sql 了,php 框架的数据库操作非常完善和好用,如果某些特殊的需要写原生 sql,直接写就是了,一点都不要担心,我保证,这样的特例,是极少数的,并不会对后期造成太大的困扰
skys215
2020-04-14 10:00:07 +08:00
在只有 controller 和 model 的情况下
有重 controller 轻 model,重 model 轻 controller 两种方式。
重 controller 的话,前端在做某些操作的时候要调用同一个 api
重 model 的话,就没有这个问题,但也有一些问题。例如,相似的操作会在方法里多次定义。
所以才会引入中间层 repository/service (怎么叫都无所谓了)。model 就只写相关定义,例如表名、主键名、枚举值之类的。
ben1024
2020-04-14 10:04:24 +08:00
新建一个 Repository 层,写在 Repository 里
0x663
2020-04-14 10:25:27 +08:00
写 html 里边
Takamine
2020-04-14 11:30:09 +08:00
@taaaang Service 可以直接和 Controller 同名服务于 Controller,把 Controller 的复杂逻辑抽出来到 Service 。
PHP 框架的 orm 和楼上说的一样都比较完善了,model 做映射之后直接给 service 层提供服务,你 sql 也这样写在 model 里面给 Service 提供服务,感觉合理一点。
james122333
2020-04-14 11:34:04 +08:00
我之前替公司弄的小型框架写在 service controller 负责回应 只是写个类
每次都
$mysql->connect();
$data = $mysql->query("
select...
", array(
参数替换
));
这样就可以了 用 orm 只是增加複杂度
Dao model 通通省了
php 字串里可加变量 "$abc" 动态性已经足够了
完成一样的事情 java 就啰唆非常多
又简单又动态的感觉是爽度
MonoLogueChi
2020-04-14 11:34:49 +08:00
@m939594960 dao 不是 java 专属的呢
james122333
2020-04-14 11:40:14 +08:00
connect()里面还可以加入 ip 使用者 选项类
顶多再弄个 enum 解决回家睡觉

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX