как оптимизировать циклические запросы с помощью Laravel Eloquent - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь получить категории, подкатегории и продукты в виде "дерева" из моей базы данных.Я новичок в Laravel, и я не знаю, как мне лучше написать это действие с помощью красноречивых методов.У меня есть 2 таблицы: Продукты и Категории у каждого продукта есть category_id, который является внешним ключом таблицы категорий

вот мой код:

    $categories = Category::with('products')->where('id', $category->id)->get()->toArray();
    foreach ($categories as $key => $value) {

        $categories[$key]['children'] = Category::with('products')->where('parent_id', $value['id'])->get()->toArray();
    }

это мой результат и его штраф

«результат»: [

    {
        "id": 2,
        "name": "Root 2",
        "parent_id": null,
        "products": [],
        "children": [
            {
                "id": 4,
                "name": "First child of Root 2",
                "parent_id": 2,
                "products": [
                    {
                        "id": 5,
                        "category_id": 4,
                        "name": "مهسا واثقی",
                        "description": "Aut eum et rerum dolorum blanditiis et itaque ipsum. Reiciendis consectetur magni est veritatis qui. Eos veniam quo aspernatur exercitationem vel incidunt. Rem aut sunt ab exercitationem.",
                        "price": "58.00",
                        "type": "video",
                        "disabled": 0,
                        "created_at": "2019-02-03 22:38:37",
                        "updated_at": "2019-02-03 22:38:37"
                    },
                ]
            },
            {
                "id": 5,
                "name": "Second child of Root 2",
                "parent_id": 2,
                "products": []
            },
            {
                "id": 6,
                "name": "Third child of Root 2",
                "parent_id": 2,
                "products": []
            }
        ]
    }
],

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Вы можете сделать с рекурсивной функцией следующим образом:

$categories = Category::with('products')->where('id', $category->id)->get()->toArray();

$categoriesWithChild = $this->GenerateCategoryArray($categories);
dd($categoriesWithChild);

Добавьте эту функцию в ваш контроллер :

function GenerateCategoryArray($arr, $parent = null)
{
    $pages = Array();
    foreach($arr as $page)
    {
       if($page['parent_id'] == $parent)
       {
           $page['child'] = isset($page['child']) ? $page['child'] : $this->GenerateCategoryArray($arr, $page['id']);
           $pages[] = $page;
        }
     }
      return $pages;
}
0 голосов
/ 04 февраля 2019

Вы можете попробовать рекурсивные отношения, например, так:

public function childCategoriesRecursive()
{
    return $this->hasMany(Category::class, 'id', 'parent_id')->with('childCategoriesRecursive');
}

Когда вы загрузите это новое отношение, Laravel автоматически выберет всю вашу иерархию категорий.Тогда ваш код должен выглядеть примерно так:

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

Теперь нет необходимости зацикливать все ваши категории.

Надеюсь, это поможет!

0 голосов
/ 04 февраля 2019

Вы можете использовать «whereIn» вместо запроса в цикле.

$categories = Category::with('products')->where('id', $category->id)->get()->toArray();
$parentCategory = $categories->pluck('id');
$categoriesObject = Category::with('products')->whereIn('parent_id', $parentCategory)->get()->toArray();
foreach($categoriesObject as $key => $value){
 $childObject[$value->paernt_id][] = $value;
}
foreach($categories as $key => $value){
  $categories[$key]['child'] = isset($childObject[$value->id]) ? $childObject[$value->id] : [];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...