Sequelize — запрос с отношением «многие ко многим» с использованием where и limit

#javascript #node.js #sequelize.js

#javascript #node.js #sequelize.js

Вопрос:

У меня есть это отношение:

Clients -> ProgramsClients <- Programs

То, что я пытаюсь сделать, в основном:

SELECT * FROM Programs p JOIN ProgramsClients pc on p.id = pc.programId WHERE pc.clientId = 1 LIMIT 0, 100;

Мне удалось достичь чего-то подобного с помощью следующего кода:

 query = {
   include: [{
       model: models.Clients,
       attributes: [],
       require: true, 
   }],
   where: { '$Clients.id$': 1 }
}

models.Programs.findAll(query) // This works
  

Который генерирует:

 SELECT [...]
FROM `programs` AS `Programs` LEFT OUTER JOIN ( 
`ProgramsClients` AS `Clients->ProgramsClients` 
INNER JOIN `clients` AS `Clients` 
ON `Clients`.`id` = `Clients->ProgramsClients`.`ClientId`) 
ON `Programs`.`id` = `Clients->ProgramsClients`.`ProgramId` 
WHERE `Clients`.`id` = 1;
  

Это работает, но когда я пытаюсь ограничить его, я получаю сообщение об ошибке.
Код:

 query = {
   include: [{
       model: models.Clients,
       attributes: [],
       require: true, 
   }],
   limit: 0,
   offset: 10,
   where: { '$Clients.id$': 1 }
}

models.Programs.findAll(query) // This fails
  

Который генерирует:

 SELECT [...]
FROM (SELECT `Programs`.`id`, `Programs`.`name`, `Programs`.`description`, `Programs`.`createdAt`, `Programs`.`updatedAt` 
FROM `programs` AS `Programs` WHERE `Clients`.`id` = 1 LIMIT 0, 10) AS `Programs` 
LEFT OUTER JOIN ( `ProgramsClients` AS `Clients->ProgramsClients` 
INNER JOIN `clients` AS `Clients` 
ON `Clients`.`id` = `Clients->ProgramsClients`.`ClientId`) 
ON `Programs`.`id` = `Clients->ProgramsClients`.`ProgramId`;
  

Ошибка:
DatabaseError [SequelizeDatabaseError]: Unknown column 'Clients.id' in 'where clause'

ПРИМЕЧАНИЕ: я использую базу данных MySQL.

Есть ли более простой способ решить эту проблему и сгенерировать желаемый (или аналогичный) результат для SQL?

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

Ответ №1:

Я взял паузу. И когда я вернулся, мне удалось это решить.

В принципе, я неправильно прочитал раздел «очень много ко многим» из документов.

Вы можете просто определить отношение «Один ко многим» (даже если вы используете отношения «многие ко многим») с таблицей ассоциации (в данном случае ProgramsClients), а затем включить ProgramsClients и делать все, что хотите. (Для этого вы должны объявить столбец id для ProgramsClients).

 query = {
   include: [{
       model: models.ProgramsClients,
       as: 'programsclient'
       attributes: [],
       require: true, 
       where: { clientId: 1 }
   }],
   limit: 0,
   offset: 10,
}