sequelize left join возвращая данные для связанной таблицы - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть две таблицы, следовательно, модели и ассоциации определили их следующим образом.

assigned_jobs
------------------------
id | job_id | emp_id 
1  |    1   | 5
2  |    2   | 6
3  |    3   | 3
4  |    4   | 2

matched_technicians
------------------------
id | job_id | emp_id 
1  |    1   | 5
2  |    1   | 6
3  |    3   | 3
4  |    3   | 2
5  |    4   | 5
6  |    4   | 6
7  |    3   | 3
8  |    3   | 2
8  |    5   | 2

Таким образом, существует несколько заданий с одинаковым идентификатором в matched_technicians, но только запись для job_id в assigned_job

AssignedJob.hasMany(models.MatchedTechnicians, { sourceKey: 'job_id', foreignKey: 'job_id' })
MatchedTechnicians.hasOne(models.AssignedJob, { sourceKey: 'job_id', foreignKey: 'job_id' })

Я хочу получить все эти записи от matched_technicians, у которого нет записей для этого job_id в assigned_jobs.

Я пытаюсь что-то ниже.

let alreadyMatchedJobs = await MatchedTechnician.findAll({
    include: {
      model: AssignedJob,
      required: false,
      attributes: ['job_id'],
    },
    group: ['job_id'],
    attributes: ['job_id', 'id'],
  });

Здесь я оставляю соединение matched_technicians с assigned_jobs и получение результата с GROUP BY job_id
Это генерирует следующий запрос.

SELECT `MatchedTechnician`.`job_id`, `MatchedTechnician`.`id`, `AssignedJob`.`id` AS `AssignedJob.id`, `AssignedJob`.`job_id` AS `AssignedJob.job_id`
FROM `matched_technicians` AS `MatchedTechnician`
LEFT OUTER
JOIN `assigned_jobs` AS `AssignedJob` ON `MatchedTechnician`.`job_id` 
= `AssignedJob`.`job_id`
GROUP BY `job_id`;

Дать результат, как показано ниже.

[
    {
        "job_id": 1,
        "id": 144,
        "AssignedJob": {
            "job_id": 1
        }
    },
    {
        "job_id": 2,
        "id": 145,
        "AssignedJob": {
            "job_id": 2
        }
    },
    {
        "job_id": 3,
        "id": 3,
        "AssignedJob": {
            "job_id": 3
        }
    },
    {
        "job_id": 4,
        "id": 2,
        "AssignedJob": {
            "job_id": 4
        }
    },
    {
        "job_id": 5,
        "id": 151,
        "AssignedJob": null
    }
]

Здесь я не понимаю, почему он дает записи с job_id в обеих таблицах.
Я хочу здесь только запись с job_id, 5.

1 Ответ

0 голосов
/ 20 апреля 2020

Нет четкой документации для исключения NULL значащих строк при выполнении левого соединения.

Я должен был сделать что-то вроде ниже.

let alreadyMatchedJobs = await MatchedTechnician.findAll({
    where: {
      '$AssignedJob.job_id$': {
        [Op.eq]: null,
      },
    },
    include: {
      model: AssignedJob,
      required: false,
    },
    group: ['job_id'],
    attributes: ['job_id', 'id'],
  });
...