Хочу попросить совета:
Предположим, что на сайте 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как добиться максимальной производительности в отношениях «многие ко многим»? [закрыто]
Anonymous » » в форуме Php - 0 Ответы
- 36 Просмотры
-
Последнее сообщение Anonymous
-