lovelilili 2019-07-11 20:04:50 398次浏览 2条回复 1 0 0

数据库表中有个字段 extend 内容如下:

{
	"type": "xxxxxxx",
	"area": "yyyyyy",
	"year": "000000",
	"star": "aaaaaa",
	"state": "bbbb",
	"language": "cccccc",
	"version": "ddddddd",
	"weekday": "一,二,三,四,五,六,日"
}

我想在 ActiveForm 表单中拆分为八个怎么操作。有没有什么好办法,不是要在 model 里增加 8 个属性吧。

QQ截图20190711200409.png

亿速云
  • 回复于 2019-07-15 14:45 举报

    提供一个思路:新建一个关联模型Extend继承Model,定义一个数组类型成员变量attributes,从库中取出数据的时候把字段和值放入attributes,重写Model__get方法,改成从attributes获取。

    /* 实际上是从数组attributes中取出type的值 */
    echo $extend->type;
    
    觉得很赞
  • 回复于 2019-07-18 17:47 举报

    你的extend是一个Json, 你需要在Model中可以直接访问是吧?
    我们写了一个包,https://github.com/ethercap/common ,不太好意思,没有来得及写文档。里面有许多实用的代码,其中就有你这种情况的解决办法。
    在composer中加上 "ethercap/common":"dev-master",然后执行composer update

    在使用时,这么使用,如果是一个model

    <?php
    use ethercap\common\behaviors\AttrBehavior;
    
    class xxModel extends Model
    {
        public function behaviors()
        {
            return [
                'class' => AttrBehavior::className(),
                //你的json的数据库字段
                'attrKey' => 'extend',
                'properties' => [
                    'type',
                    'area',
                    //其它属性....
                ],
            ];
        }
    
    }
    ?>
    

    只要这么配好之后,$model->type,$model->area是可以直接取的,$model->save()时也会存入extend的json中,不用担心任何问题,它跟正常$model的属性是一样的,只是存储方式不一样罢了。另外,rules之类也都是可以正常使用的。

    觉得很赞
您需要登录后才可以回复。登录 | 立即注册