比如数据表B的数据里面记录的是这样:
distribution.....分配.....NULL
appoint..........人数.....NULL
rate5............转化率...distribution/appoint
数据表A现在要显示distribution和appoint这两个字段,并且现在需要动态的显示一个新的字段rate5,其值来自公式计算的值。
当用户需要查看这个表的数据的时候,再动态的计算出这些值,这样可以不用写分页和排序,并且代码简洁。
yii2有一个DynamicModel可以动态添加attribute,但是不支持数据库表。所以这个方法应该不行。
1
picasso250 2015-07-15 12:54:39 +08:00 1
为什么不创建view,然后裸写sql?
|
2
yantze OP @picasso250 目前我用的就是这样的方法,但是随着项目的跟进,有可能代码会越来越难维护。
所以我现在先使用拼接手写sql代码,以后打算重写一个基类,专门做这种model |
3
justfindu 2015-07-15 13:25:59 +08:00 1
model里面增加一个 function getRate5 ; return distribution/appoint.
这样就可以用魔法函数 直接 $model->rate5 直接获取了 |
5
yantze OP @justfindu 并且我按照你的方法去做完了,但是使用GridView后,不能自动排序。很可能是因为,AR model排序也是用sql排的,所以,目前最完美的解法,只能是写一个新的基类。
|
6
AsterOcclu 2015-07-15 15:58:58 +08:00 1
@yantze @justfindu 的方法是对的,至于GridView的排序和搜索功能,需要你自己去扩展对应的sort方法。http://www.yiiframework.com/doc-2.0/guide-output-sorting.html
|
7
jarlyyn 2015-07-15 17:45:58 +08:00
2不熟。
但从我的角度来看 都要自定义表单功能了,还不如直接丢给前端js+api处理,别考虑 gridview了。 |
10
jarlyyn 2015-07-16 13:56:02 +08:00 1
@yantze
以Yii 1.x为例,我会这么做: 创建一个api,用user/session认证。 创建一个formModel,把offset/limit/排序/各种过滤选型都丢在里面,并负责验证。 通过formModel生成合适的CdbCriteria,用于生成合适的数据。 以json返回。 前台用react/underscore来渲染。 好处是不用动1里蛋疼的要死的gridview。 稍微复杂点的东西就基本是通过eval来实现,各种排序也是,满蛋疼的。 自己写前端舒服多了。 |
11
yantze OP @jarlyyn 虽然说了这么多,但是还是没有说明Model里面如何动态的添加可排序的新字段。
这种涉及底层的东西并不是修改model就可以实现的。 因为yii当初设计model的时候,对于AR model只做了数据库的映射,对于非数据库字段的排序并没有定义SQL排序方法,所以,只能通过重写底层的model来实现的。 有兴趣可以一起写一个这样的model出来。 |
12
jarlyyn 2015-07-17 10:25:54 +08:00
@yantze
至少在Yii 1.x里,排序不该找Model, 应该找cdbcriteria. 可以在model里新建一个scope,用于合并cdbcriteria. 另外恕我不能 理解 ‘动态的添加可排序的新字段’ 的概念…… 排序一般不是数据库处理的事情吗…… |
13
jarlyyn 2015-07-17 10:29:58 +08:00
@yantze
大概的去看了下2的文档 2里cdbcriteria对应的概念应该是activequery http://www.yiiframework.com/doc-2.0/yii-db-activequery.html |
14
jarlyyn 2015-07-17 10:31:19 +08:00
@yantze
我觉得你需要的排序这一块的应该找这里: http://www.yiiframework.com/doc-2.0/yii-db-querytrait.html#orderBy()-detail |