PHP自定義問卷調查的設計及思路

wanzi發表於2020-11-27

最近專案需求需要做一個自定義的問卷調查,給需要的小夥伴們分享下。

需求是 需要後臺新增自定義問卷,包括題目、題型、是否必答、選項等資訊。廢話不多說直接上成品圖。



程式碼就不貼了因為沒有什麼繁雜的邏輯,重點是資料庫的設計,這個功能最好的解決方案應該是MongoDB,我採用的是MySql,一共是 5 張表。

① 問卷表

CREATE TABLE `pro_question` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `class_id` text COMMENT '班級ID',
  `title` varchar(50) DEFAULT NULL COMMENT '標題',
  `desc` text COMMENT '簡介',
  `end_time` date DEFAULT NULL,
  `status` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '',
  `created_at` timestamp NULL DEFAULT NULL COMMENT '建立時間',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COMMENT='問卷調查表';

② 題目表 question_id 關聯表①

CREATE TABLE `pro_questionnaire_topic` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `question_id` int(10) DEFAULT NULL COMMENT '所屬問卷id',
  `title` varchar(300) NOT NULL COMMENT '題目名稱',
  `is_answer` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '是否必答:0=是,1=否',
  `type` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '題型:0=單選,1=多選,2=填空',
  `sort` int(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
  `created_at` timestamp NULL DEFAULT NULL COMMENT '建立時間',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COMMENT='問卷調查題目表';

③ 選項表 topic_id 關聯表②

CREATE TABLE `pro_question_topic_options` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `topic_id` int(10) unsigned NOT NULL COMMENT '所屬題目id',
  `name` varchar(100) DEFAULT NULL COMMENT '選項名稱',
  PRIMARY KEY (`id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8mb4 COMMENT='問卷調查題目選項表';

④ 答案表 topic_id 關聯表②

CREATE TABLE `pro_question_answers` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `member_id` int(10) unsigned NOT NULL COMMENT '所屬使用者id',
  `topic_id` int(10) unsigned NOT NULL COMMENT '所屬題目id',
  `answers` text COMMENT '答案',
  `created_at` timestamp NULL DEFAULT NULL COMMENT '建立時間',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='問卷調查回答表';

⑤ 使用者問卷關聯表 question_id 關聯表①

CREATE TABLE `pro_questionnaire_count` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `question_id` int(10) unsigned NOT NULL COMMENT '所屬問卷id',
  `member_id` int(10) NOT NULL COMMENT '所屬使用者id',
  `created_at` timestamp NULL DEFAULT NULL COMMENT '建立時間',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `normal_question_id` (`question_id`) USING BTREE,
  KEY `normal_class_id` (`class_id`) USING BTREE,
  KEY `normal_member_id` (`member_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='問卷調查計數表';

單選、多選、填空的答案都是一個欄位,單選的直接存答案id就可以,多選的存逗號拼接的答案id,填空直接是內容就好。

自己也是第一次弄,有好的解決方案的可以留言交流,不足之處請多指點。謝謝大家。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章