面试中被问的 yii2 问题,求教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sytnishizuiai
V2EX    PHP

面试中被问的 yii2 问题,求教

  •  
  •   sytnishizuiai 2018-03-08 01:40:38 +08:00 7510 次点击
    这是一个创建于 2829 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1 第一个问题是,Model 我是 gii 创建的,如果一个表内字段一直在增加,不改代码的情况下,写的 insert 可以一直 用。 我一直用的 AR 的方式存,存字段都是$this->,自动的话怎么弄呢?

    2 第二个问题是,一次存多个表,我是 new 多个 model 或者多表 AR find,让我简化,insert 的时候不用多个 new

    查了好久,没找到好的方法,求教。

    16 条回复    2018-03-08 18:25:43 +08:00
    s2722357
        1
    s2722357  
       2018-03-08 09:04:30 +08:00   1
    我的 PHP 很基础呀.....
    1. 表中字段给默认值的话,insert 的语句怎么都不会报错吧,和代码没有什么关系呀。如果是想让程序知道数据库加字段了,可以通过查询遍历出所有列,再生成 HTML 页面,再遍历,通过反射( PHP 叫什么不知道)或者生成数组(用 medoo 插入)。
    2. 简化不知道,但多表插入或更新,主要的关注点应该在挂事务和锁吧....
    fatjiong
        2
    fatjiong  
       2018-03-08 09:10:15 +08:00   2
    1.一般还是要改下代码。在 model 的 rules 里头把新的字段加个 rule 条件过滤或者直接 safe,就可以写入了。
    2.不想 new 多个 model 的话,也可以在第一个 model 里面写好后续的插入方法,也可以加到 afterSave 事件里头,也可以自己写个事件绑定触发下。
    qce7
        3
    qce7  
       2018-03-08 09:26:27 +08:00   1
    重载 model 的 load 方法,$this->setAttributes($data)改为$this->setAttributes($data, false);
    就可以达到目的了,但是这并不安全
    weer0026
        4
    weer0026  
       2018-03-08 09:29:27 +08:00   1
    非要用 AR 的情况下,如果不按照字段生成 model 的话,干脆就不要走 rules 验证了,直接 insert(false),insert 多表不能 new model 倒是不清楚,因为本来每个 model 实例就代表一个表的一行数据,就算用 link 也只有在多对多有中间表的情况下可以隐式给中间表保存数据。
    MyDaLin
        5
    MyDaLin  
       2018-03-08 10:10:36 +08:00
    看了这些 Yii 视频教程,还有什么难得倒你
    http://www.sucaihuo.com/video/149-0-0
    respect11
        6
    respect11  
       2018-03-08 10:39:30 +08:00
    *材火的广告无处不在呀
    sytnishizuiai
        7
    sytnishizuiai  
    OP
       2018-03-08 11:10:39 +08:00
    谢谢大家
    1 第一个问题,我原先是认为有新业务,增加数据库原有表的字段( user 表加个微信字段),需要新增的话就改代码吧。面试要求每次表内加新的字段,insert 代码不需要修改就能适应,难道是 foreach?
    2 第二个问题,(事务和锁用的)同个模块需要插入多表数据,我目前是每次插入数据 new User 或者 User->findOne(id),多个 new 就行了,省掉这些 new 也省不了多少代码。。。我也不清楚真的能省掉吗,省掉的方法比原来的实用 性价比高吗,如果不高的话 也没必要把简单的搞复杂
    invoke
        8
    invoke  
       2018-03-08 11:17:50 +08:00   1
    自动用 load 装载呀。。然后写好 rules 和设定好场景就可以了
    第二个不用 new 就真的不清楚了。
    invoke
        9
    invoke  
       2018-03-08 11:19:53 +08:00   1
    @sytnishizuiai

    如果用 foreach 反而不好。因为没有各种规则验证,而且 foreach 获得的不一定是安全属性。
    硬要这么实现,前端传入了不需要的参数,没有经过规则就直接 insert 了。虽然说不用改代码,但是隐患重重啊。
    sytnishizuiai
        10
    sytnishizuiai  
    OP
       2018-03-08 12:03:34 +08:00
    @invoke 是的 foreach 肯定不好不用的,就是能符合的就想到这个,load 装载我去看看,谢谢
    picone
        11
    picone  
       2018-03-08 15:17:57 +08:00   1
    第二个问题是问的是关联模型的增删查改?

    港道理,面试问框架用法有意义吗。。
    NjcyNzMzNDQ3
        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;
    NjcyNzMzNDQ3/td>
        13
    NjcyNzMzNDQ3  
       2018-03-08 17:09:43 +08:00   1
    如果有自定义的 rules,就 array_merge 一下就好了
    NjcyNzMzNDQ3
        14
    NjcyNzMzNDQ3  
       2018-03-08 17:11:57 +08:00   1
    第二个如果不想 new 多个 ar,用 mysql 的视图,个人觉得不让 new 多个 ar 没啥意思啊,考的是 clone 类?
    NjcyNzMzNDQ3
        15
    NjcyNzMzNDQ3  
       2018-03-08 17:14:54 +08:00   1
    不是 clone 类就是单例模式
    sytnishizuiai
        16
    sytnishizuiai  
    OP
       2018-03-08 18:25:43 +08:00
    @NjcyNzMzNDQ3 感谢 学到了,第二个如果是单纯考就算了,实际操作没什么意义。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3466 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 05:04 PVG 13:04 LAX 21:04 JFK 00:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86