Регистрация не работает для секвелирования ассоциаций принадлежит ToMany - PullRequest
0 голосов
/ 05 октября 2019

Я проверяю все ассоциации с sequelize, и у меня возникает проблема с получением объединений для многих со многими принадлежами. - 1001 *

https://github.com/lhferrh/Sequelize-Playground.git

Когда я выполняю поискВсе через, я получаюall null для результата объединения

Я проверял несколько комбинаций, но дело в том, что SQL, генерируемый sequelize, работает непосредственно на MySQL, и это меня действительно смущает.

ЭтоSQL при условии:

SELECT `user`.`userId`, `user`.`name`, `user`.`createdAt`, `user`.`updatedAt`, `cars`.`carId` AS `cars.carId`, `cars`.`make` AS `cars.make`, `cars`.`createdAt` AS `cars.createdAt`, `cars`.`updatedAt` AS `cars.updatedAt`, `cars->favorites`.`favoritesId` AS `cars.favorites.favoritesId`, `cars->favorites`.`date` AS `cars.favorites.date`, `cars->favorites`.`createdAt` AS `cars.favorites.createdAt`, `cars->favorites`.`updatedAt` AS `cars.favorites.updatedAt`, `cars->favorites`.`userId` AS `cars.favorites.userId`, `cars->favorites`.`carId` AS `cars.favorites.carId` FROM `users` AS `user` LEFT OUTER JOIN ( `favorites` AS `cars->favorites` INNER JOIN `cars` AS `cars` ON `cars`.`carId` = `cars->favorites`.`carId`) ON `user`.`userId` = `cars->favorites`.`userId`;

Это код, который я бегу:

const Users = sequelize.define('user', {
    userId: {
        type: Sequelize.INTEGER,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
          type: Sequelize.STRING,
      }, 

    } 
);

const Favorites = sequelize.define('favorites', {
    favoritesId: {
      type: Sequelize.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },

    date: {
      type: Sequelize.DATE,
    }
  }
);

  const Cars = sequelize.define('cars', {
    carId: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      make: Sequelize.STRING
  })

  Users.belongsToMany(Cars, {
    through: 'favorites',
    sourceKey: 'userId',
    foreignKey: 'userId'
  });
  Cars.belongsToMany(Users, {
    through: 'favorites',
    sourceKey: 'carId',
    foreignKey: 'carId'
  });


const intiDataBase = async () => {
    await sequelize.sync({force: true});
}

const run = async () => {
    const max = 3;
    await intiDataBase();

    await Promise.all( DATA.users.map( async elem=> 
         Users.create({...elem})
    ))

    await Promise.all( DATA.cars.map( async elem => 
        Cars.create({...elem})
   ))

   for( let i = 0 ; i < 5 ; i++ ){
       Favorites.create({
           userId: getRandomInt(1 , max),
           carId: getRandomInt(0, max)
       })
   }


   const car = await Users.findAll({
       include: [{
        model: Cars,
        through: {
            attributes: ['userId', 'carId'],

          }
        //attributes: ['make'],
        }],
        raw: true
   });

   const favorites = await Favorites.findAll({
        where:{
            userId:2
        },
        raw: true
    });

   console.log(car);
   console.log(favorites);

} 

run();

Это результат, который я получаю:

    name: 'Johan',
    createdAt: 2019-10-05T08:57:57.000Z,
    updatedAt: 2019-10-05T08:57:57.000Z,
    'cars.carId': null,
    'cars.make': null,
    'cars.createdAt': null,
    'cars.updatedAt': null,
    'cars.favorites.favoritesId': null,
    'cars.favorites.date': null,
    'cars.favorites.createdAt': null,
    'cars.favorites.updatedAt': null,
    'cars.favorites.userId': null,
    'cars.favorites.carId': null } ], ...

Возможно, это проблема с именамино тот факт, что SQL работает напрямую, действительно сбивает с толку.

Я надеюсь, что любой из вас может увидеть ошибку.

Кстати, мне также было интересно, что может быть недостатком в созданииОтношение многие ко многим вручную путем создания двух связей 1: m с промежуточной таблицей?

1 Ответ

0 голосов
/ 06 октября 2019

Я нашел свою ошибку. При добавлении избранного в базу данных отсутствует ожидание. По этой причине соединение дало неверный результат в запросе и правильный результат в базе данных напрямую.

for( let i = 0 ; i < 5 ; i++ ){
       await Favorites.create({
           userId: getRandomInt(1 , max),
           carId: getRandomInt(0, max)
       })
   }

Как я и ожидал, глупая ошибка.

В любом случае, я все еще сомневаюсь в том, чтобы использовать ownToMany или создать отношение «многие ко многим» самостоятельно, и всегда использую два шага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...