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
取出。
后续,待更新。