V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sytnishizuiai
V2EX  ›  PHP

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

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

    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
        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   ·   实用小工具   ·   2799 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:37 · PVG 21:37 · LAX 05:37 · JFK 08:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.