Laravel 表单动态扩展 
                            
                                                    
                        
                    
                    
  
                    
                    构想基于Laravel框架,其他请自行脑补充。
首先创建表单类型表(form_type):
CREATE TABLE `ue_form_type` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `is_enable` tinyint(1) NOT NULL DEFAULT '1',
  `title` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci以产品表(product)为例:
CREATE TABLE `ue_form_product` (
  `id` bigint(20) unsigned NOT NULL COMMENT '自增',
  `title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '中文名',
  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '英文名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci将常用的属性(中文名、英文名)记录到主表,属性动态扩展表我们这样设计:
CREATE TABLE `ue_form_product_ext` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增',
  `version` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '版本号',
  `type_id` bigint(20) unsigned NOT NULL COMMENT '表单类型',
  `form_id` bigint(20) unsigned NOT NULL COMMENT '表单',
  `skey` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '键名',
  `svalue` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '键值',
  PRIMARY KEY (`id`),
  KEY `version` (`version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci这里注意下form_id我们在要配置型likeable类型,version标识版本号,在不同的阶段要记录内容可能不一样。
关于type_id用法,为了便于减少后期开发的工作量,我们可以用过使用type_id定义表单的扩展字段,从而无需为version的变更修改后端代码,只需修改模版即可。
注意::为了保证数据的一致性建议使用Askedio / laravel5-soft-cascade扩展包。
Eloquent 模型文件添加下面的代码:
    protected $appends = ['rofile'];
    protected $version  = 1;
    public function getProfileAttribute() {
        $profiles   = $this->ext;
        foreach ($profiles as $key => $profile) {
            $this->attributes['profile'][$profile->skey] = $profile->svalue; 
                        //此处也可以直接append到attributes内,请按需修改
        }
        return $this->attributes['profile'];
    }
    protected function ext(){
                //$this->version可以从配置文件获取
        return $this->hasMany(FormProductExt::class, 'form_id')->where(['version'=>$this->version]);
    }注意:FormProductExt::class内要启用likeable否则无法获取对应的form内容。
扩展属性的保存使用统一方法接口保存,数据类型如下所示:
$data = [
    ['form_id' => 1, 'version' => 1, 'type_id' => 1, 'skey' => 'sku', 'svalue' => '00210001100001'],
    ['form_id' => 1, 'version' => 1, 'type_id' => 1, 'skey' => 'pic', 'svalue' => '00210001100001_800x600.jpg'],
    ['form_id' => 1, 'version' => 1, 'type_id' => 1, 'skey' => 'pic_index', 'svalue' => '00210001100001_200x500.jpg'],
    ['form_id' => 1, 'version' => 1, 'type_id' => 1, 'skey' => 'is_special', 'svalue' => '1'],
    ['form_id' => 1, 'version' => 1, 'type_id' => 1, 'skey' => 'is_market', 'svalue' => '0'],
];自定义属性sku、pic、pic_index、is_special、is_market可以通过$product->profile取出。
后续,待更新。
 
           
         
             
             
             
             
             
             
             
                     
                     
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: