为什么 php 的框架(Laravel、ThinkPHP)都不是在模型处统一定义数据库字段?

2016-04-10 11:06:09 +08:00
 gamexg

原来用 python+django ,现在正在学习 php+Laravel 。

一个地方想不明白, Laravel 为什么不像 django 一样统一在模型处定义数据库结构,而自动生成迁移脚本?

目前 Laravel 需要手写迁移及撤销迁移的变更。多次迁移后,想知道当前数据库结构只能查看多次的迁移记录或者去数据库查看当前的数据库结构了。如果将字段定义放到模型里面能清楚知道当前代码需要的数据库结构了,迁移及撤销迁移脚本是能自动生成的。

目前外键关系即需要在迁移脚本里面指定,还需要在模型里面指定,而且模型里面还需要指定两次,很奇怪的做法...

ThinkPHP 和 Laravel 都是一样的做法,在模型里面定义字段是不是有什么坑?如果没有坑的话 Laravel 有没有计划将字段定义移动到模型里面?是不是已经有开源插件实现了自动生成迁移了?

5290 次点击
所在节点    PHP
39 条回复
xujif
2016-04-10 17:09:28 +08:00
@gamexg 从 java 转过来的吧,刚开始我也这么想,不过 migration 的作用不是模型,而是迁移,迭代开发的时候,更改数据库特别好用。可以方便的 migrate or rollback ,这是模型与数据库对比做不到的。
@msg7086 多个系统访问同一个数据库本来就不是好事, migration 不是 orm 如果使用 migrateion 只要在一个项目利用就好了。
wanghanlin
2016-04-10 17:14:05 +08:00
@gamexg 不是所有数据库都有对应模型的,也不是所有模型都有一个数据库, Laravel 可以处理多个模型对应同一个表。
xujif
2016-04-10 17:15:06 +08:00
@gamexg 另外 laravel 没有约定模型目录,只要符合 autoload 就可以使用模型,原则上 laravel 并不知道你有多少模型,放在哪里,所以没有第三方的库帮你生成模型文件。
php 是不能申明成员类型,所以 eloquent 不知道 relation 类型,也不能自动帮你生成外键。
xuwenmang
2016-04-10 17:24:03 +08:00
Migrations 用 Schema 类来定义、管理数据表的版本。
Eloquent ORM 使用类来操作表,传说中的增删改查。


两个不一样的事儿,搞在一起干嘛?
gamexg
2016-04-10 17:29:23 +08:00
@realpg 共用的表当然只有一个所有者开启迁移(也就一个选项的事),手写迁移脚本的时候也不会在多个项目里面都写迁移脚本啊。数据结构也一样,原来就也需要每个项目里面都写模型的外键关联,原来多个项目共享模型的外键关联现在一样共享。
gamexg
2016-04-10 17:42:26 +08:00
@xujif 是从 python +django 转过来的,原来修改了模型字段,运行一下命令会自动根据当前模型字段定义及之前的迁移脚本生成这次修改的迁移脚本,外键关联之类的更是自动生成的。现在做个修改还需要自己写迁移脚本,写外键关联,好麻烦啊。

@xuwenmang 想偷懒啊,搞在一起我只用写一遍数据库定义,迁移、外键之类的东西能自动生成当然更省事啊。
xujif
2016-04-10 17:46:26 +08:00
@gamexg php 应该没办法做到 code first ,或者说 laravel 没办法做到(因为没有约定 model 目录),忍吧。
不过 migration 确实不是用来做这个的。 migration 的好处是强制程序员声明数据库更改,可以回溯数据库修改。协作开发的时候如果涉及数据库修改会很方便,出错了也可以回滚。
realpg
2016-04-10 17:49:05 +08:00
@gamexg
建议去大厂核心数据看看。非要说 PHP 的话,有代表性的比如鹅厂的 BQQ 相关,数据库结构,设计,查询审计都是 DBA 的活,程序层可以访问完整结构去查询,但是每个查询都要审计。
很多业务,数据库是亘古不变就存在的,而 webapp 则是满地跑。

我并不支持 php 的这种类 ror 设计,我觉得 django 这种方便,但是什么都要设计成这种就有点强制洗脑了。
ichou
2016-04-10 18:47:29 +08:00
也许你可以试一下 mongodb ,这样你就没有 migration 的困扰了 😂😂😂
ty0716
2016-04-10 19:12:24 +08:00
@xujif
强制程序员声明数据库更改

这个有点牵强吧,还不是有人直接 navicat 改
mcfog
2016-04-10 21:51:40 +08:00
竟然没人提 doctrine 😂
Chrics
2016-04-10 22:26:17 +08:00
因为自由
neoblackcap
2016-04-10 23:13:00 +08:00
@chloerei 明明你这么熟 RoR 你就不要这样子嘛,楼主的意思就是生成 migration 文件的意思,这个迁移文件当然只是一个手脚架,不含数据迁移的过程嘛。
msg7086
2016-04-11 01:12:35 +08:00
@neoblackcap migration 也可以迁移数据的啊。

@ty0716 Rails 下几乎没有人会直接改数据库结构。
xujif
2016-04-11 11:19:30 +08:00
@ty0716 这个初衷就是开发自建本地数据库,而不是大家连一个公共数据库。测试的时候重新 migration and seed 如果直接修改本地数据库,提交测试上去,如果数据库不一致,则测试必然失败,不允许发布。
overtrue
2016-04-11 11:39:48 +08:00
@gamexg 对,比如新增 Entity 来做字段映射, Model 就是现有的 Model 。 也有人这么玩的。哈哈
gamexg
2016-04-11 12:27:54 +08:00
@overtrue 有现成的开源实现吗?有的话就方便多了。
neoblackcap
2016-04-11 13:19:40 +08:00
@msg7086 但题主明显就不是想要手写的 mirgation 嘛,仅机器生成的又不可能做到数据迁移嘛。
jhdxr
2016-04-12 00:08:37 +08:00
@gamexg 有的,上面有人提到了,叫 doctrine 。

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

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

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

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

© 2021 V2EX