eggjs怎么实现任何字段模型的方法?

发布于 2022-09-07 09:05:57 字数 503 浏览 41 评论 0

我最近玩了strapi框架,认识到了这个结构最好的地方是,一,任何字段模型,二,可扩展插件。其中,这个任何字段模型的方法有点复杂,我还没摸清好几十天,估计是刚接触到后端技术还没有知道那么多。

参考 strapi 任何字段模型

图片描述

即使选择好了几个类型,这些类型会保存到数据库新表,比如建立article表,article的字段会有对应类型,这样结构挺好灵活,不用每次手动增加mvc之类的代码,直接存好数据库。

比如创建一张文章表,文章表还没有加入字段模型,那么在后台里面选择字符串、日期、数字来做成标题,作者。。。之类,然后就会建立类似MVC模式的结构,自然会保存到那张文章表。

这个结构值得我参考,不过我不知道这个方法怎么实现?

我目前做的是采用eggjs这个框架,那么在eggjs里面怎么实现这个字段模型方法?

最后一句话:我希望您现在就是我的好老师!谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

掀纱窥君容 2022-09-14 09:05:57
  1. 简单分析一下题意,你的意思应该是指:
    1.1 通过【图形化的界面】添加【数据表中的属性列】。产生的效果就是【MongoDB中出现对应的数据表(table_article)】,同时框架文件夹中生成了【对应的数据模型(article.model)】
    1.2 纠正你的说法,应该是strapi这个框架【整体采用了MVC设计范例】。【1.1】并不是生成了MVC的结构,只是生成了Model
  2. 如何实现【1.1】所说的效果?
    2.1 虽然给你的感觉是通过【图形化的界面】生成。但是始终离不开【命令行】的操作。在strapi的文档中有专门介绍【CLI】的板块,可以参考并搜索框架的源码,始终是需要自己去探索的,别人都只是帮助你解释概念而已
    2.2 strapi并不是第一个实现【1.1】方式的框架,Laravel同样非常典型。如果你觉得strapi的英文文档难以理解,可以去看一下Laravel的中文文档。和strapi的【CLI】相同的,在Laravel中我们使用Artisan指令
    2.3 strapi使用的是MongoDB,你同时可能还需要看一下MongoDB文档中的命令行指令
奈何桥上唱咆哮 2022-09-14 09:05:57

谢邀,简单说两句。目前 Egg.js 里面 Model 层的编写比较混乱,没有一个较为统一的方案,各自 ORM 插件也各自为战,限制较多,多 ORM 共存时也存在较大的兼容性问题。具体可以参考:RFC-1775 重定义 Model 层,我个人目前采用的是 egg-sequelize,个人觉得还是比较好用,sequelize 文档也比较全。

意中人 2022-09-14 09:05:57

推荐用 egg-sequelize 文档也很全

模型

// app/model/user.js

module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;

  const User = app.model.define('user', {
    login: STRING,
    name: STRING(30),
    password: STRING(32),
    age: INTEGER,
    last_sign_in_at: DATE,
    created_at: DATE,
    updated_at: DATE,
  });

  User.findByLogin = function* (login) {
    return yield this.findOne({
      where: {
        login: login
      }
    });
  }

  User.prototype.logSignin = function* () {
    yield this.update({ last_sign_in_at: new Date() });
  }

  return User;
};

控制器

// app/controller/user.js
module.exports = app => {
  return class UserController extends app.Controller {
    * index() {
      const users = yield this.ctx.model.User.findAll();
      this.ctx.body = users;
    }

    * show() {
      const user = yield this.ctx.model.User.findByLogin(this.ctx.params.login);
      yield user.logSignin();
      this.ctx.body = user;
    }
  }
}
千鲤 2022-09-14 09:05:57

这个其实很简单啊。需求类似于一个文章可以添加10中field中的任意几种,支持多个。
那你创建一个文章表,然后再创建10张field表,每张表都跟文章表关联即可。

后续扩展也很容易,添加一个 field 类型只要新增一张表即可。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文