A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Relaciones uno a muchos

18/27
Recursos

Aportes 8

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Si tienen alg煤n problema al hacer la migraci贸n pueden usar el comando:

sequelize-cli db:migrate --debug

Para hallar m谩s informaci贸n sobre el error.

Al crear estas 2 tablas(en el .js de la migracion), hay que hacerlas en la misma posici贸n que la clase. Sino les va a dar error ya que Sequelize va a intentar crear primero productos pero al no existir la tabla de category no va a tener forma de hacer la relaci贸n

Les dejo el c贸digo de Product y Category por si no quieren escribir 馃槃
.

category.model.js

const { Model, DataTypes, Sequelize } = require('sequelize');

const CATEGORY_TABLE = 'categories';

const CategorySchema = {
	id: {
		allowNull: false,
		autoIncrement: true,
		primaryKey: true,
		type: DataTypes.INTEGER,
	},
	name: {
		type: DataTypes.STRING,
		unique: true,
		allowNull: false,
	},
	image: {
		type: DataTypes.STRING,
		allowNull: false,
	},
	createdAt: {
		allowNull: false,
		type: DataTypes.DATE,
		field: 'created_at',
		defaultValue: Sequelize.NOW,
	},
};

class Category extends Model {
	static associate(models) {
		this.hasMany(models.Product, {
			as: 'products',
			foreignKey: 'categoryId',
		});
	}

	static config(sequelize) {
		return {
			sequelize,
			tableName: CATEGORY_TABLE,
			modelName: 'Category',
			timestamps: false,
		};
	}
}

module.exports = { Category, CategorySchema, CATEGORY_TABLE };

.
product.model.js
.

const { Model, DataTypes, Sequelize } = require('sequelize');

const { CATEGORY_TABLE } = require('./category.model');

const PRODUCT_TABLE = 'products';

const ProductSchema = {
	id: {
		allowNull: false,
		autoIncrement: true,
		primaryKey: true,
		type: DataTypes.INTEGER,
	},
	name: {
		type: DataTypes.STRING,
		allowNull: false,
	},
	image: {
		type: DataTypes.STRING,
		allowNull: false,
	},
	description: {
		type: DataTypes.TEXT,
		allowNull: false,
	},
	price: {
		type: DataTypes.INTEGER,
		allowNull: false,
	},
	createdAt: {
		allowNull: false,
		type: DataTypes.DATE,
		field: 'created_at',
		defaultValue: Sequelize.NOW,
	},
	categoryId: {
		field: 'category_id',
		allowNull: false,
		type: DataTypes.INTEGER,
		references: {
			model: CATEGORY_TABLE,
			key: 'id',
		},
		onUpdate: 'CASCADE',
		onDelete: 'SET NULL',
	},
};

class Product extends Model {
	static associate(models) {
		this.belongsTo(models.Category, { as: 'category' });
	}

	static config(sequelize) {
		return {
			sequelize,
			tableName: PRODUCT_TABLE,
			modelName: 'Product',
			timestamps: false,
		};
	}
}

module.exports = { Product, ProductSchema, PRODUCT_TABLE };

En este caso, cuando se utiliza hasMany, la relaci贸n queda en productos. La relaci贸n va en la entidad d茅bil (productos).

De la misma manera que se hizo en la relaci贸n uno a uno, se hacen las asociaciones correspondientes en los modelos, se genera la migraci贸n, se configura el init y se corre la migraci贸n.

product.model.js:

const { Model, DataTypes, Sequelize } = require('sequelize');
const { CATEGORY_TABLE } = require('./category.model');

const PRODUCT_TABLE = 'products'; // nombre de la tabla

const ProductSchema = {
  // El esquema define la estructura de la BD.
  id: {
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: DataTypes.INTEGER,
  },
  name: {
    allowNull: false,
    type: DataTypes.STRING,
  },
  image: {
    allowNull: false,
    type: DataTypes.STRING,
  },
  description: {
    allowNull: false,
    type: DataTypes.TEXT,
  },
  price: {
    allowNull: false,
    type: DataTypes.INTEGER,
  },
  createdAt: {
    allowNull: false,
    type: DataTypes.DATE,
    field: 'created_at',
    defaultValue: Sequelize.NOW,
  },
  categoryId: {
    field: 'category_id',
    allowNull: false,
    type: DataTypes.INTEGER,
    references: {
      model: CATEGORY_TABLE,
      key: 'id',
    },
    onUpdate: 'CASCADE',
    onDelete: 'SET NULL',
  },
};

class Product extends Model {
  static associate(models) {
    this.belongsTo(models.Category, { as: 'category' });
  }

  static config(sequelize) {
    return {
      sequelize,
      tableName: PRODUCT_TABLE,
      modelName: 'Product',
      timestamps: false,
    };
  }
}

module.exports = { Product, PRODUCT_TABLE, ProductSchema };

category.model.js:

const { Model, DataTypes, Sequelize } = require('sequelize');

const CATEGORY_TABLE = 'categories'; // nombre de la tabla

const CategorySchema = {
  // El esquema define la estructura de la BD.
  id: {
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: DataTypes.INTEGER,
  },
  name: {
    allowNull: false,
    type: DataTypes.STRING,
    unique: true,
  },
  image: {
    allowNull: false,
    type: DataTypes.STRING,
  },
  createdAt: {
    allowNull: false,
    type: DataTypes.DATE,
    field: 'created_at',
    defaultValue: Sequelize.NOW,
  },
};

class Category extends Model {
  static associate(models) {
    this.hasMany(models.Product, {
      as: 'products',
      foreignKey: 'categoryId',
    });
  }

  static config(sequelize) {
    return {
      sequelize,
      tableName: CATEGORY_TABLE,
      modelName: 'Category',
      timestamps: false,
    };
  }
}

module.exports = { Category, CATEGORY_TABLE, CategorySchema };

Migraci贸n product:

'use strict';

const { CategorySchema, CATEGORY_TABLE } = require('../models/category.model');
const { ProductSchema, PRODUCT_TABLE } = require('../models/product.model');

module.exports = {
  up: async (queryInterface) => {
    await queryInterface.createTable(CATEGORY_TABLE, CategorySchema);
    await queryInterface.createTable(PRODUCT_TABLE, ProductSchema);
  },

  down: async (queryInterface) => {
    await queryInterface.dropTable(CATEGORY_TABLE);
    await queryInterface.dropTable(PRODUCT_TABLE);
  },
};

db/models/index.js:

const { User, UserSchema } = require('./user.model');
const { Customer, CustomerSchema } = require('./customer.model');
const { Category, CategorySchema } = require('./category.model');
const { Product, ProductSchema } = require('./product.model');

function setupModels(sequelize) {
  User.init(UserSchema, User.config(sequelize));
  Customer.init(CustomerSchema, Customer.config(sequelize));
  Category.init(CategorySchema, Category.config(sequelize));
  Product.init(ProductSchema, Product.config(sequelize));

  User.associate(sequelize.models);
  Customer.associate(sequelize.models);
  Category.associate(sequelize.models);
  Product.associate(sequelize.models);
}

module.exports = setupModels;

Increible, cada vez que avanzo en el curso y en la ruta de escuela de javascript me siento increiblemente preparado con todo lo que estoy aprendiendo, es realmente facinante este mundo del backend con node, con este curso definitivamente creo que el backend es lo mio 馃槂

Hola amigos, yo tenia un problema con la relaci贸n 1-M y tenia el mismo c贸digo que el profesor.

Y lo solucione quitando la entidad de la relaci贸n en el [product.model.js] y agreghandoselo a una nueva migraci贸n ya teniendo las tablas deadas en la base de datos de la siguiente manera:

y as铆 quedo mi diagrama E-R:

La forma en la que estamos utilizando el schema para las migrations no es compatible con la idea de lo que son las migraciones en un ambiente compartido, porque si por ejemplo creo mi schema y en base a ese schema creo mis migrations, luego, actualizo el schema y en base a esa actualizacion creo una nueva migration y esos dos cambios los comiteo a git, quien se baje mis cambios por primera vez y corra la primer migration, ya va a tomar los cambios con el schema actualizado y va a romper al intentar ejecutar las migrations siguientes.

Se me ocurre como solucion, no usar el schema como import, sino que copiarlo en cada migration. Tambien para que quede un historico mas detallado de que se hizo en cada migration.

Uff me costaba entender uno a muchos