1 第一个问题是,Model 我是 gii 创建的,如果一个表内字段一直在增加,不改代码的情况下,写的 insert 可以一直 用。 我一直用的 AR 的方式存,存字段都是$this->,自动的话怎么弄呢?
2 第二个问题是,一次存多个表,我是 new 多个 model 或者多表 AR find,让我简化,insert 的时候不用多个 new
查了好久,没找到好的方法,求教。
1
s2722357 2018-03-08 09:04:30 +08:00 1
我的 PHP 很基础呀.....
1. 表中字段给默认值的话,insert 的语句怎么都不会报错吧,和代码没有什么关系呀。如果是想让程序知道数据库加字段了,可以通过查询遍历出所有列,再生成 HTML 页面,再遍历,通过反射( PHP 叫什么不知道)或者生成数组(用 medoo 插入)。 2. 简化不知道,但多表插入或更新,主要的关注点应该在挂事务和锁吧.... |
2
fatjiong 2018-03-08 09:10:15 +08:00 2
1.一般还是要改下代码。在 model 的 rules 里头把新的字段加个 rule 条件过滤或者直接 safe,就可以写入了。
2.不想 new 多个 model 的话,也可以在第一个 model 里面写好后续的插入方法,也可以加到 afterSave 事件里头,也可以自己写个事件绑定触发下。 |
3
qce7 2018-03-08 09:26:27 +08:00 1
重载 model 的 load 方法,$this->setAttributes($data)改为$this->setAttributes($data, false);
就可以达到目的了,但是这并不安全 |
4
weer0026 2018-03-08 09:29:27 +08:00 1
非要用 AR 的情况下,如果不按照字段生成 model 的话,干脆就不要走 rules 验证了,直接 insert(false),insert 多表不能 new model 倒是不清楚,因为本来每个 model 实例就代表一个表的一行数据,就算用 link 也只有在多对多有中间表的情况下可以隐式给中间表保存数据。
|
5
MyDaLin 2018-03-08 10:10:36 +08:00
看了这些 Yii 视频教程,还有什么难得倒你
http://www.sucaihuo.com/video/149-0-0 |
6
respect11 2018-03-08 10:39:30 +08:00
*材火的广告无处不在呀
|
7
sytnishizuiai OP 谢谢大家
1 第一个问题,我原先是认为有新业务,增加数据库原有表的字段( user 表加个微信字段),需要新增的话就改代码吧。面试要求每次表内加新的字段,insert 代码不需要修改就能适应,难道是 foreach? 2 第二个问题,(事务和锁用的)同个模块需要插入多表数据,我目前是每次插入数据 new User 或者 User->findOne(id),多个 new 就行了,省掉这些 new 也省不了多少代码。。。我也不清楚真的能省掉吗,省掉的方法比原来的实用 性价比高吗,如果不高的话 也没必要把简单的搞复杂 |
8
invoke 2018-03-08 11:17:50 +08:00 1
自动用 load 装载呀。。然后写好 rules 和设定好场景就可以了
第二个不用 new 就真的不清楚了。 |
9
invoke 2018-03-08 11:19:53 +08:00 1
@sytnishizuiai
如果用 foreach 反而不好。因为没有各种规则验证,而且 foreach 获得的不一定是安全属性。 硬要这么实现,前端传入了不需要的参数,没有经过规则就直接 insert 了。虽然说不用改代码,但是隐患重重啊。 |
10
sytnishizuiai OP @invoke 是的 foreach 肯定不好不用的,就是能符合的就想到这个,load 装载我去看看,谢谢
|
11
picone 2018-03-08 15:17:57 +08:00 1
第二个问题是问的是关联模型的增删查改?
港道理,面试问框架用法有意义吗。。 |
12
NjcyNzMzNDQ3 2018-03-08 17:08:41 +08:00 1
第 1 题,代码
public function rules() { $column = []; array_map(function($item) use( &$column){ $column[$item->type][] = $item->name; }, self::getTableSchema()->columns); $rules = []; foreach($column as $columnType => $columns){ $rules[] = [ $columns, $columnType ]; } dump($rules); exit; |
13
NjcyNzMzNDQ3 2018-03-08 17:09:43 +08:00 1
如果有自定义的 rules,就 array_merge 一下就好了
|
14
NjcyNzMzNDQ3 2018-03-08 17:11:57 +08:00 1
第二个如果不想 new 多个 ar,用 mysql 的视图,个人觉得不让 new 多个 ar 没啥意思啊,考的是 clone 类?
|
15
NjcyNzMzNDQ3 2018-03-08 17:14:54 +08:00 1
不是 clone 类就是单例模式
|
16
sytnishizuiai OP @NjcyNzMzNDQ3 感谢 学到了,第二个如果是单纯考就算了,实际操作没什么意义。
|