Данная статья будет про то как можно строить связи между таблицами FeathersJS при использование ORM sequelize. Я бы очень хотел чтоб такой материал был уже на русском (или даже на английском) но к сожалению не нашёл.
Шаг 1 – знакомство с ORM sequelize
Итак, чтобы использовать ORM sequelize нужно понять её принцип работы и то как она позволяет делать связи между моделями. Рекомендую читать несколько раз (и внимательно) вот эту статью: http://docs.sequelizejs.com/manual/tutorial/associations.html, тут описано подробно про каждый возможный тип связи.
Шаг 2 – Понять как работает Feathers JS с sequelize
Сразу приведу пример модели в который описывается связь:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
const Sequelize = require('sequelize'); const DataTypes = Sequelize.DataTypes; module.exports = function (app) { const sequelizeClient = app.get('sequelizeClient'); const category = sequelizeClient.define('category', { icon: { type: DataTypes.STRING, allowNull: true }, parent: { type: DataTypes.INTEGER.UNSIGNED, allowNull: false } }, { timestamps: false, убираем поля createdAt и updatedAt freezeTableName: true, underscored: true, // мне удобнее так hooks: { beforeCount(options) { options.raw = false; } } }); // Дальше описываем связь category.associate = function (models) { models.category.hasMany(models.category_translate, { constraints: true, foreignKey: 'category_id', // это поле с таблицы category_translate as: 'translate' // это алиас таблицы который желаю использовать }; return category; }; |
Теперь создадим новое hook которое назовём translate и там соединяем нашу модель category_translate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
module.exports = function (options = {}) { return function categoryTranslate (hook) { const AssociatedModel = hook.app.services['category-translate'].Model; // выбираем модель которую хотели связать hook.params.sequelize = { include: [{ model: AssociatedModel, as: 'translate', // тут нужно писать тот же алиас который использовали в модели category.models query: { $limit: 1, $select: [ 'country_icon' ] }, where: { // если хотим задать какие-то параметры для таблицы category_translate то их нужно писать тут lang: hook.params.query['$language'] // это для примера } }] }; delete hook.params.query['$language']; delete hook.params.query.include; return Promise.resolve(hook); }; }; |
Результаты
Теперь если сделать вот такой запрос:
то в результате получим нужный результат:
Присоединяйтесь к сообществу Feathers в Телеграмме: t.me/featherjs
Всем спасибо за внимание.