Как в sequalize ограничить лимит при использовании findAll и ассоциации hasMany Leave a comment

Sequelize — это основанная на обещаниях ORM Node.js для Postgres, MySQL, MariaDB, SQLite и Microsoft SQL Server.

Sequalize обеспечивает надежную поддержку транзакций, отношения и т.д.

Допустим у вас есть модель:

В этом случае SupplierProfile ассоциирована с Statistic как один к многим.

Например:

1-й записи таблице SupplierProfile с полем supplierId = 1 соответствует 15 записей из Statistic с supplierId = 1

В запросе нам необходимо получить строго 1-у запись из Statistic, первое что приходит в голову это использовать в includ ключ limit с значением 1:

Не верный запрос:

С ходу этот запрос вызовет ошибку, самая частая из них это «TypeError: Cannot read property ‘push’ of undefined»

Дело в том что, пытаясь ограничить данные из Statistic мы вынуждаем sequalize сделать два запроса в базу данных, но когда приоходят данные от первого запроса — sequalize уже не знает как связать данные из Statistic и SupplierProfile, потому что в атрибутах Statistic не указано поле через которое связаны Statistic и SupplierProfile. В нашем случае это supplierId

Тогда правельный запрос с ограничением limit 1 для findAll и ассоцииации hasMany будет следующий:

Как видно в модели Statistic к значениям attributes мы добавили поле supplierId.

Тогда если разложить на чистые sql запросы которые делает sequalize, получаем следующее:

1 -й запрос:

Извлекаются все записи из таблицы SupplierProfile

2-й запрос(только часть):

По каждой записи из SupplierProfile делается SELECT в таблицу Statistic

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *