У меня есть 2 таблицы, которые используют ассоциацию ownToMany через 3-ю таблицу. Я хотел бы запросить указанного пользователя c из пользовательской таблицы с включенным в него массивом связанных списков воспроизведения (из таблицы списков воспроизведения), которые соответствуют user_id.
Ожидаемый запрос возврата
{
user_id: 'id',
...
user_playlists: [{
playlist_id: 'id',
playlist_title: 'title',
playlist_songs:[...],
...
},{...}]
}
Я на самом деле делаю это в sequelize-typcript, но вот postgresql команды для настройки.
списки воспроизведения
CREATE TABLE IF NOT EXISTS "playlists" ("playlist_id" VARCHAR(255) , "playlist_title" VARCHAR(255), "playlist_description" VARCHAR(255), "playlist_image" VARCHAR(255), "playlist_songs" INTEGER[], "playlist_createdAt" TIMESTAMP WITH TIME ZONE, "playlist_updatedAt" TIMESTAMP WITH TIME ZONE, PRIMARY KEY ("playlist_id"));
пользователи
CREATE TABLE IF NOT EXISTS "users" ("user_id" VARCHAR(255) , "user_firstName" VARCHAR(255), "user_lastName" VARCHAR(255), "user_email" VARCHAR(255), "user_password" VARCHAR(255), "user_favourites" INTEGER[], "user_following" INTEGER[], "user_recentlyPlayed" INTEGER[], "user_createdAt" TIMESTAMP WITH TIME ZONE, "user_updatedAt" TIMESTAMP WITH TIME ZONE, PRIMARY KEY ("user_id"));
user_playlist
CREATE TABLE IF NOT EXISTS "user_playlist" ("user_id" VARCHAR(255) REFERENCES "users" ("user_id") ON DELETE CASCADE ON UPDATE CASCADE, "playlist_id" VARCHAR(255) REFERENCES "playlists" ("playlist_id") ON DELETE CASCADE ON UPDATE CASCADE, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, UNIQUE ("user_id", "playlist_id"), PRIMARY KEY ("user_id","playlist_id"));
Последовательность команд запроса
const result = await User.findByPk(id, {
raw: false,
include: [
{
model: Playlist,
where: {user_id: id},
as: 'user_playlists',
required: false,
attributes: ['playlist_id', 'playlist_title'],
},
],
});
И сгенерированный postgresql запрос
SELECT "User"."user_id", "User"."user_firstName", "User"."user_lastName", "User"."user_email", "User"."user_password", "User"."user_favourites", "User"."user_following", "User"."user_recentlyPlayed", "User"."user_createdAt", "User"."user_updatedAt", "user_playlists"."playlist_id" AS "user_playlists.playlist_id", "user_playlists"."playlist_title" AS "user_playlists.playlist_title", "user_playlists->UserPlaylist"."user_id" AS "user_playlists.UserPlaylist.user_id", "user_playlists->UserPlaylist"."playlist_id" AS "user_playlists.UserPlaylist.playlist_id", "user_playlists->UserPlaylist"."createdAt" AS "user_playlists.UserPlaylist.createdAt", "user_playlists->UserPlaylist"."updatedAt" AS "user_playlists.UserPlaylist.updatedAt"
FROM "users" AS "User"
LEFT OUTER JOIN ( "user_playlist" AS "user_playlists->UserPlaylist"
INNER JOIN "playlists" AS "user_playlists"
ON "user_playlists"."playlist_id" = "user_playlists->UserPlaylist"."playlist_id")
ON "User"."user_id" = "user_playlists->UserPlaylist"."user_id"
AND "user_playlists"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1'
WHERE "User"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1';
Вот ошибка, которую я получаю:
postgresql | 2020-03-20 15:57:05.976 UTC [58] ERROR: column user_playlists.user_id does not exist at character 1015
Я могу подтвердить, что в таблице user_playlist есть столбец user_id:
SELECT * FROM user_playlist;
user_id | playlist_id | createdAt | updatedAt
------------------------------+--------------------------------------+----------------------------+----------------------------
H2qAdR0c81c3xGFk5PmgDXKAjis1 | 9cf2e2ed-932b-4e98-bb6a-39c1e324dc09 | 2020-03-20 16:30:08.387+00 | 2020-03-20 16:30:08.387+00
Мне кажется, что запрос неверен после последнего AND
Если я вручную выполню следующее изменение в запросе postgresql:
From:
AND "user_playlists"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1' WHERE "User"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1';
To:
AND "user_playlists->UserPlaylist"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1' WHERE "User"."user_id" = 'H2qAdR0c81c3xGFk5PmgDXKAjis1';
Тогда запрос работает, но как я могу получить продолжение к сделать это?
Может, я что-то не так сделал в настройке?
Кстати у меня на "sequelize": "5.21.5" и postgres: 11,6-альпийский