Хочу попросить совета:
Предположим, что на сайте 1 миллион товаров и 3 тысячи категорий. Таблица категорий имеет Category_id и Parent_id. Отношения «многие ко многим».
Как лучше всего связать продукт с категорией?
Вариант 1. Ссылка на одну последнюю категорию. . Например, «сумочки». При заказе товаров из категории «сумочки» все просто и быстро. Но при запросе товаров из категории «одежда, обувь и аксессуары» я сначала путем рекурсии получаю список всех вложенных идентификаторов категорий из таблицы категорий, а затем запрашиваю все товары, связанные с этими категориями (перечисляю тысячу категорий идентификаторы). Так как вложенность может быть большой, например: Одежда, обувь и аксессуары -> Аксессуары -> Сумки и рюкзаки -> Сумки -> Сумки.
Вариант 2: Привязать товар ко всем категориям из последнюю категорию сразу в высшую родительскую категорию. То есть сначала я получаю список идентификаторов родительских категорий из таблицы категорий посредством рекурсии и записываю несколько строк в таблицу категории_продуктов. В этом случае при запросе товаров из категории «Одежда, обувь и аксессуары» я буду запрашивать только товары, относящиеся к этой категории.
Как же тогда добиться максимальной производительности, когда показывать товары пользователю?
Сейчас я делаю это:
$allCategories = Category::where('total_products', '!=', 0)->get();
$idsChildCategories = Functions::getIdsChildCategories($allCategories, $category->title, $category->category_id, $category->id);
$allProducts = Product::whereHas('categories', function ($query) use ($idsChildCategories){
$allProducts = Product::whereHas('categories', function ($query) use ($idsChildCategories) {
$query->whereIn('categories.id', $idsChildCategories);
})
->where('price', '!=', null)
->orderBy($sort['value'], $sort['flags'])
->with('categories', 'genders', 'brands', 'colors', 'styles', 'materials', 'seasons', 'countries', 'features', 'ages')
->get();
static function getIdsChildCategories($allCategories, $category_title, $category_id, $id) {
if (isset($category_title)) {
$array = [$id];
} else {
$array = [];
}
foreach ($allCategories as $key => $value) {
if ($value->parent_id == $category_id && $value->total_products > 0) {
$array[] = $value->id;
$array[] = self::getIdsChildCategories($allCategories, null, $value->category_id, $value->id);
}
}
$flattened = Arr::flatten($array);
return $flattened;
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... lationship
Как добиться максимальной производительности в отношениях «многие ко многим»? ⇐ Php
Кемеровские программисты php общаются здесь
1719341204
Anonymous
Хочу попросить совета:
Предположим, что на сайте 1 миллион товаров и 3 тысячи категорий. Таблица категорий имеет Category_id и Parent_id. Отношения «многие ко многим».
Как лучше всего связать продукт с категорией?
Вариант 1. Ссылка на одну последнюю категорию. . Например, «сумочки». При заказе товаров из категории «сумочки» все просто и быстро. Но при запросе товаров из категории «одежда, обувь и аксессуары» я сначала путем рекурсии получаю список всех вложенных идентификаторов категорий из таблицы категорий, а затем запрашиваю все товары, связанные с этими категориями (перечисляю тысячу категорий идентификаторы). Так как вложенность может быть большой, например: Одежда, обувь и аксессуары -> Аксессуары -> Сумки и рюкзаки -> Сумки -> Сумки.
Вариант 2: Привязать товар ко всем категориям из последнюю категорию сразу в высшую родительскую категорию. То есть сначала я получаю список идентификаторов родительских категорий из таблицы категорий посредством рекурсии и записываю несколько строк в таблицу категории_продуктов. В этом случае при запросе товаров из категории «Одежда, обувь и аксессуары» я буду запрашивать только товары, относящиеся к этой категории.
Как же тогда добиться максимальной производительности, когда показывать товары пользователю?
Сейчас я делаю это:
$allCategories = Category::where('total_products', '!=', 0)->get();
$idsChildCategories = Functions::getIdsChildCategories($allCategories, $category->title, $category->category_id, $category->id);
$allProducts = Product::whereHas('categories', function ($query) use ($idsChildCategories){
$allProducts = Product::whereHas('categories', function ($query) use ($idsChildCategories) {
$query->whereIn('categories.id', $idsChildCategories);
})
->where('price', '!=', null)
->orderBy($sort['value'], $sort['flags'])
->with('categories', 'genders', 'brands', 'colors', 'styles', 'materials', 'seasons', 'countries', 'features', 'ages')
->get();
static function getIdsChildCategories($allCategories, $category_title, $category_id, $id) {
if (isset($category_title)) {
$array = [$id];
} else {
$array = [];
}
foreach ($allCategories as $key => $value) {
if ($value->parent_id == $category_id && $value->total_products > 0) {
$array[] = $value->id;
$array[] = self::getIdsChildCategories($allCategories, null, $value->category_id, $value->id);
}
}
$flattened = Arr::flatten($array);
return $flattened;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78669077/how-to-get-maximum-performance-in-a-many-to-many-relationship[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия