A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Resolviendo las relaciones uno a uno

17/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.

Para Evitar repetir codigo en los schemas se puede importar los schemas del user y agregarlos al validador del customer

const joi = require(鈥榡oi鈥);

const { createUserSchema, updateUserSchema } = require('./user.schema');

const createCustomerSchema = joi.object({
  firstName: firstName.required(),
  lastName: lastName.required(),
  phone: phone.required(),
  user: createUserSchema
});

const updateCustomerSchema = joi.object({
  firstname: firstName,
  lastname: lastName,
  phone: phone,
  user: updateUserSchema
});

de esta forma si en un futuro se agrega un validador al user schema no habia que hacer nada en el customer schema

Sequelize est谩 simplificando el c贸digo bastante!

Como puede ser una forma de tener las dos cosas? Me refiero a que el ultimo cambio del video nos quito la posibilidad de poder crear un Customer con ya un usuario creado.

Para modificar una columna se usa el m茅todo changeColumn en el boilerplate de la migraci贸n, seguido del nombre de la tabla y de la columna que se desea modificar y poniendo los atributos que definir谩n la nueva columna.

'use strict';
const { DataTypes } = require('sequelize');

const { CUSTOMER_TABLE } = require('../models/customer.model');

module.exports = {
  up: async (queryInterface) => {
    await queryInterface.changeColumn(CUSTOMER_TABLE, 'user_id', {
      field: 'user_id',
      allowNull: false,
      type: DataTypes.INTEGER,
      unique: true,
    });
  },

  down: async (queryInterface) => {
    // await queryInterface.dropTable(CUSTOMER_TABLE);
  },
};

Con esos cambios se vuelve a correr la migraci贸n, nota que en caso de que existan campos repetidos, no se permitir谩 correr la migraci贸n porque rompe con la nueva regla del campo unique. Manualmente se debe ir a la BD y arreglar esos 铆ndices.

Hecho esto se corre la migraci贸n.

Cuando se hace el request para obtener los customers, se hace el llamado a la asociaci贸n en el m茅todo find de customers.service.js. Ah铆 se incluye el alias de la asociaci贸n asignada en el modelo de customer:

async find() {
    const rta = await models.Customer.findAll({
      include: ['user']
    });
    return rta;
  }

De esa manera se resuelve la relaci贸n de forma anidada, de la misma manera se puede resolver a customers por el lado de users.

Para ello se hacen las respectivas asociaciones en user.model.js, nota que cuando se hace hasOne significa que la relaci贸n est谩 de lado de customers:

class User extends Model {
  static associate(models) {
    this.hasOne(models.Customer, {
      as: 'customer',
      foreignKey: 'userId'
    })
  }
}

La asociaci贸n tambi茅n debe colocarse en db/models/index.js:

const { User, UserSchema } = require('./user.model');
const { Customer, CustomerSchema } = require('./customer.model');

function setupModels(sequelize) {
  User.init(UserSchema, User.config(sequelize));
  Customer.init(CustomerSchema, Customer.config(sequelize));

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

module.exports = setupModels;

Para crear un user cuando se crea un customer, se debe modificar el m茅todo create dentro del modelo customer.service.js de la siguiente manera:

async create(data) {
    const newCustomer = await models.Customer.create(data, {
      include: ['user'],
    });
    return newCustomer;
  }

Debido a que ya se hizo una asociaci贸n de user-customer, se debe agregar el include con el nombre del la asociaci贸n hacia user.

Importante!! Observaci贸n sobre como correr migraciones que modifican restricciones/constraints en bases de datos

Ya quedaron las relaciones!

Estamos ahorrando c贸digo de forma bestial.