Как в зависимости от условия производить сортировку, используя данные одного или же другого поля?
Допустим существует модель Product:
model Product {
@@map(name: "products")
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String @db.VarChar(255) @unique
price Int
discountPrice Int?
discountBool Boolean @default(false)
}
Среди полей имеются:
- name - наименование товара;
- price - цена на товар;
- discountPrice - более низкая цена на товар, отображается на товаре, если он продается со скидкой;
- discountBool - определяет будет ли продаваться товар по скидке.
Соответственно сортировка у меня выглядит пока только так:
const products = await Product.findMany({
orderBy: [
{
price: 'asc'
},
{
name: 'asc'
},
]
})
То есть на данный момент товары сортируются только по цене или по имени, если цены совпали. Но нужно, чтобы при сортировке товаров по ценам еще учитывалось установлена ли скидка на товар (discountBool == true). И если на товар включена скидка, то конкретно этот товар сортировать, используя данные из discountPrice, вместо price.
В случае, если Prisma не имеет встроенных способов решить данную задачу, то как тогда хотя бы сделать это в Prisma, но с использованием PostgreSQL?
Ответы (1 шт):
Благодарю вас за предоставленный код запроса и за идею поискать у Prisma метод, позволяющий выполнить внутри SQL. В документации описывается такой способ.
const products = await prisma.$queryRaw
`
SELECT *
FROM products
ORDER BY
CASE
WHEN "discountBool" THEN "discountPrice" ELSE price
END ASC,
name ASC;
`
Также, раз уж я затронул NodeJS и PostgreSQL, то здесь в качестве альтернативы можно использовать библиотеку pg.