У меня есть 2 таблицы связанные с собою много ко многим, к примеру категории и продукты
3 таблица осуществляет связь между ними, когда пишу join запрос то продукты у которых 2 и более категории дублируются 2 и более раз соответсвенно, как решить эту проблему ? Отдельно выбирать продукты и категории, а потом их мапить ?
const _products = await knex('products')
.select(
'products.name as productName',
'products.id as productId',
'categories.id as categoryId',
'products.url as productUrl',
'categories.url as categoryUrl',
'categories.name as categoryName'
)
.leftJoin(
'categories_products',
'categories_products.product_id',
'=',
'products.id'
)
.leftJoin(
'categories',
'categories.id',
'=',
'categories_products.category_id'
)
Ответ:
[
{
"productName": "natus",
"productId": 1,
"categoryId": 6,
"productUrl": "http://june.com-natus",
"categoryUrl": "caps",
"categoryName": "Шапки"
},
{
"productName": "natus",
"productId": 1,
"categoryId": 4,
"productUrl": "http://june.com-natus",
"categoryUrl": "jackets",
"categoryName": "Куртки"
},
]
Получится должно так, но для этого я отдельно выбираю категоии и продукты и потом в цикле их собираю:
[
{
"id": 1,
"name": "natus",
"url": "http://june.com-natus",
"description": "Ipsam id dolores et suscipit illo. Magnam eveniet enim laborum omnis sint iste quo deserunt omnis. Exercitationem eum beatae atque animi qui iusto eos ipsam sint. Omnis consequatur suscipit beatae dolores illo rem soluta voluptatem sit. Aliquam et sit repellendus.\n \rModi distinctio suscipit tempora est eius vel fuga dolore. Voluptates alias vel qui iste nihil voluptatem quas error culpa. Facere illum sunt qui.\n \rNon in ut aut blanditiis nam. Ad qui aut aut voluptate nulla. Enim quia impedit ipsam perferendis expedita magnam nisi qui eligendi. Esse tempore est exercitationem alias omnis voluptatem non tenetur rem. Ut porro animi molestiae. Eveniet ducimus et voluptatem dolores hic eum.",
"imageUrl": "http://lorempixel.com/640/480/abstract",
"enabled": 1,
"price": "404.97",
"categories": [
{
"id": 6,
"category_id": 6,
"product_id": 1,
"name": "Шапки",
"url": "caps",
"enabled": 1
},
{
"id": 4,
"category_id": 4,
"product_id": 1,
"name": "Куртки",
"url": "jackets",
"enabled": 1
}
],
"options": []
},
]
И тот же вопрос когда связь к 1му
Запрос:
const _category = knex('categories')
.select(
'categories.name as categoriesName',
'categories.url as categoriesUrl',
'products.name as productName',
'products.url as productUrl'
)
.leftJoin(
'categories_products',
'categories_products.category_id',
'=',
'categories.id'
)
.leftJoin(
'products',
'products.id',
'=',
'categories_products.product_id'
)
.where('categories.id', id)
Ответ:
[
{
"categoriesName": "Куртки",
"categoriesUrl": "jackets",
"productName": "dolores",
"productUrl": "https://dominic.com-dolores"
},
{
"categoriesName": "Куртки",
"categoriesUrl": "jackets",
"productName": "dolores",
"productUrl": "http://crawford.name-dolores"
},
{
"categoriesName": "Куртки",
"categoriesUrl": "jackets",
"productName": "natus",
"productUrl": "http://june.com-natus"
}
]