Упорядочить — Могу ли я связать модель на основе другого отношения модели?

#sequelize.js #forestadmin

Вопрос:

Доброе утро, я пытался решить проблему, но у меня недостаточно опыта работы с sequelize, чтобы знать, есть ли решение или нет, так что вот моя проблема:

У меня есть одна модель с именем Order, другая модель с именем Service и 8 других моделей с именами «orderAttributeA», «orderAttributeB», «orderAttributeC» ….

моя модель заказа работает так, как показано ниже:

 module.exports = (sequelize, DataTypes) => {
const {Sequelize} = sequelize;
// Learn more here: https://docs.forestadmin.com/documentation/v/v6/reference-guide/models/enrich-your-models#declaring-a-new-field-in-a-model
const Order = sequelize.define('order', {
    id: {
        type: DataTypes.BIGINT,
        autoIncrement: true,
        primaryKey: true
    },
    userId: {
        type: DataTypes.BIGINT,
        allowNull: false,
    },
    companyId: {
        type: DataTypes.BIGINT,
        allowNull: false,
    },
    serviceId: {
        type: DataTypes.BIGINT,
        allowNull: false,
    },
    providerId: {
        type: DataTypes.BIGINT,
        allowNull: true,
        defaultValue: null
    },
    status: {
        type: DataTypes.INTEGER,
        allowNull: false,
    },
    userComment: {
        type: DataTypes.STRING,
        allowNull: true,
        defaultValue: null
    },
    amount: {
        type: DataTypes.INTEGER,
        defaultValue: 0,
        allowNull: false,
    },
    deliveryDate: {
        type: DataTypes.DATE,
        allowNull: true,
        defaultValue: null
    },
    createdAt: {
        type: DataTypes.DATE,
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
    },
    updatedAt: {
        type: DataTypes.DATE,
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        onUpdate: Sequelize.literal('CURRENT_TIMESTAMP')
    },
}, {
    tableName: 'Order',
});

Order.associate = async (models) => {
    Order.belongsTo(models.user, {
        foreignKey: 'userId',
    });

    Order.hasMany(models.orderDetail, {
        foreignKey: 'orderId',
        as: 'details',
    });

    Order.belongsTo(models.service, {
        foreignKey: 'serviceId',
        as: 'service',
    });

    Order.hasOne(models.orderPayment, {
        foreignKey: 'orderId',
        as: 'payment',
    });
};

return Order;
 

};

моя модель обслуживания :

 module.exports = (sequelize, DataTypes) => {
  const { Sequelize } = sequelize;
  const Service = sequelize.define('service', {
    name: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    className: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    categoryId: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
    externalLink: {
      type: DataTypes.STRING,
    },
    createdAt: {
      type: DataTypes.DATE,
      defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
    },
    updatedAt: {
      type: DataTypes.DATE,
      defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
      onUpdate: Sequelize.literal('CURRENT_TIMESTAMP')
    },
  }, {
    tableName: 'Service',
  });

  Service.associate = (models) => {
  };

  return Service;
};
 

one of my orderAttributeXXX model :

 module.exports = (sequelize, DataTypes) => {
  const { Sequelize } = sequelize;
  const OrderAttributeB = sequelize.define('orderAttributeB', {
    orderId: {
      type: DataTypes.BIGINT,
      primaryKey: true,
      allowNull: false,
    },
    firstName: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    lastName: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    createdAt: {
      type: DataTypes.DATE,
      defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
    },
    updatedAt: {
      type: DataTypes.DATE,
      defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
      onUpdate: Sequelize.literal('CURRENT_TIMESTAMP')
    },
  }, {
    tableName: 'OrderAttributeB',
  });

  OrderAttributeB.associate = (models) => {
  };

  return OrderAttributeB;
};
 

Что я пытаюсь сделать, так это выбрать соответствующую модель (orderAttributeXXX) на основе имени класса моей службы, чтобы отношение выглядело следующим образом : Order.serviceId -> служба, где идентификатор = order.serviceId ->> получить столбец имя класса службы ->>> найдите модель на основе столбца имя класса службы, НО нет связи между моделью «служба» и любой из моделей «orderAttributeXXX». Возможно ли достичь чего-то подобного в sequelize ?:

 // i would like to select the corresponding model (orderAttribute) based on the column className of my model service
    Order.belongsTo(models.service.className, {
        foreignKey: 'orderId',
        as: 'attribute',
    });
 

Заранее спасибо

Комментарии:

1. Это как-то связано? community.forestadmin.com/t/dynamic-smart-relation/2554

2. Да, действительно, извините, если это немного дублирует тему. Я не знал, что у нас уже есть сообщение на сайте лесного сообщества.

Ответ №1:

Это не что-то (поле динамической ссылки), поддерживаемое forestadmin из коробки.

Хакерским решением для такого рода проблем было бы использование смарт-коллекции смарт-поля

Например, вы могли бы определить интеллектуальную коллекцию OrderAttributes , определенную следующим образом

 collection('OrderAttributes', {
  fields: [{ 
    field: 'id', // This is mandatory
    type: 'String' 
  }, { 
    field: 'orderAttributeA', 
    type: 'String', 
  }, { 
    field: 'orderAttributeA', 
    type: 'orderAttributeB',
  }, ...]
});
 

Затем переопределите маршруты для /forest/order-attributes /forest/order , и т. Д. чтобы наладить разумные отношения между Order amp; OrderAttributes .

Комментарии:

1. Я вижу! Спасибо, тогда я так и сделаю