Я работаю с Sequelize 4.37.10, и он отлично работает. К сожалению, на мой взгляд, документация не идеальна. Таким образом, здесь не хватает описания возможностей ownToMany.
У меня такая проблема:
Я определил свои таблицы так:
const Department = db.define('department', {
name: {type: Sequelize.STRING, allowNull: false},
shortName: {type: Sequelize.STRING, allowNull: false}
})
const Employee = db.define('employee', {
title: {type: Sequelize.STRING},
name: {type: Sequelize.STRING, allowNull: false},
surname: {type: Sequelize.STRING, allowNull: false},
.
.
role: {type: Sequelize.STRING}
})
Затем я связал таблицы следующим образом:
const EmployeeDepartments = db.define('employeeDepartments', {
manager: {type: Sequelize.BOOLEAN, allowNull: false}
})
Department.belongsToMany(Employee, {through: EmployeeDepartments})
Employee.belongsToMany(Department, {through: EmployeeDepartments})
Теперь я хочу, чтобы все сотрудники отдела установили для поля менеджера значение true. Создание не было проблемой, но выбор - проблема для меня.
Я безуспешно пробовал следующее:
department.getEmployees({where: {manager: true}})
Я тоже думал о прицелах, но не знаю, как их правильно спроектировать.
Вы можете мне с этим помочь?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


department.getEmployees({where: {manager: true}})
измените этот код на это.
department.getEmployees(
include:{
model: employeedepartments, // your employee departments model name
{where: {manager: true},
required:true,
}
})
Вам нужно просто добавить в свой запрос
Как ни странно, я просто искал то же самое, и единственным результатом был ваш вопрос, заданный несколько часов назад ...
Я решил это сейчас, вам нужно следующее:
department.getEmployees({ through: { where: { manager: true } } })
Вы также можете получить всех сотрудников department, из которых у вас есть только id:
const department = Department.build( { id: departmentId } );
// proceed as above
Хороший! К сожалению, Продолжить документы ничего не говорит о опции through. Спасибо! На мой взгляд, вторая строка кода проще с использованием Department.findById(departmentId).
Проблема с этим подходом в том, что вы попадаете в БД. build этого не делает.
Кроме того, вы можете столкнуться с этой проблемой, связанной с невозможностью удалить поле ассоциации departmentEmployee из результирующих сотрудников (см. Эту проблему: github.com/sequelize/sequelize/issues/3664). Я решил это с помощью employees.forEach( e => delete e.dataValues['department_employee'] )
Я сам нашел очень простой ответ после некоторого времени поисков.
При использовании belongsToMany Sequelize действительно использует соединение для получения данных из второй таблицы (я это знал).
У меня была возможность использовать следующий синтаксис:
department.getEmployees({where: {'$employeeDepartments.manager$': true}})
Я нашел это на странице в Google, но, к сожалению, я потерял URL-адрес. Может быть, это поможет кому-то с подобной проблемой.
include ожидает массив