Laravel категорий и производительности - PullRequest
2 голосов
/ 21 января 2020

Я использовал модель самореференции для создания вложенной категории:

class Category extends Model {

    public function parent()
    {
        return $this->belongsTo('Category', 'parent_id');
    }

    public function children()
    {
        return $this->hasMany('Category', 'parent_id');
    }

   // recursive, loads all descendants
   public function childrenRecursive()
   {
      return $this->children()->with('childrenRecursive');
   }
}

и для получения родителей со всеми своими детьми:

$categories = Category::with('childrenRecursive')->whereNull('parent')->get();

Но у меня возникли проблемы с производительностью для моего большая таблица (вложенная категория 3 уровня)
Есть ли лучший способ получить категории?

И мой второй вопрос. предположим, что мои категории выглядят примерно так:

- Digital
 - Mobiles
   - Power Banks
   - Cover & Bumper
 - Computers
- Health
   - Bar

И мои сообщения могут быть в любой категории, например Digital или Mobiles или Powerbank Когда пользователь спрашивает меня о категории Digital, которую я должен показать мои пользователи все мои сообщения в этой категории или в дочерних категориях Digital. И когда меня спросят о Mobiles, я должен показать своим пользователям все мои сообщения в этой категории или в дочерних категориях Mobile Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 21 января 2020
$categoryWithNestedSubCategoriesAndProducts = Category::with(['products', 'childrenRecursive', 'childrenRecursive.products'])->where('id',$id)->get()->toArray();

Сведение laravel рекурсивной коллекции отношений

Сначала мы должны сгладить нашу laravel рекурсивную коллекцию отношений (коллекции деревьев), используя такую ​​функцию, как

public function flatten($array)
{
        $flatArray = [];

        if (!is_array($array)) {
            $array = (array)$array;
        }

        foreach($array as $key => $value) {
            if (is_array($value) || is_object($value)) {
                $flatArray = array_merge($flatArray, $this->flatten($value));
            } else {
                $flatArray[0][$key] = $value;
            }
        }

        return $flatArray;
}

Получить список продуктов

$categoryWithNestedSubCategoriesAndProducts = Category::with(['products', 'childrenRecursive', 'childrenRecursive.products'])->where('id', $id)->get()->toArray();

$flatten = $this->flatten($categoryWithNestedSubCategoriesAndProducts);

foreach ($flatten as $key => $fl) {
    // eliminate categories from $flatten array
    if (!array_key_exists('category_id', $fl)) {
        unset($flatten[$key]);
    }
}

$products = array_values($flatten);
2 голосов
/ 21 января 2020

Это метод, который я использовал для своего проекта. Я получаю список всех категорий, а затем контролирую их. Я не нашел подходящего способа использовать eloquent в этом случае. Я рекомендую прочитать ссылку ниже. иерархические данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...