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'],
];

自定义属性skupicpic_indexis_specialis_market可以通过$product->profile取出。

后续,待更新。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!