简体   繁体   English

Laravel Eloquent 嵌套组的关系

[英]Laravel Eloquent Nested Group by its Relation

Please help me how to add another nested group by based on game category relation.请帮助我如何根据游戏类别关系添加另一个嵌套组。 I have 3 tables related using laravel 5.4 eloquent.我有 3 个使用 laravel 5.4 eloquent 相关的表。

Game Providers Table游戏提供商表

+----+-------------+--------------+------------------+
| id | game_name   | game_type_id | game_category_id |
+----+-------------+--------------+------------------+
|  1 | Sample      |      1       |         1        |
|  1 | Sample 0    |      1       |         2        |
|  2 | Sample 1    |      2       |         1        |
|  3 | Sample 2    |      2       |         2        |
+----+-------------+--------------+------------------+

Game Types游戏类型

+----+-------------+
| id | name        |
+----+-------------+
|  1 | Chess       |
|  2 | Poker       |
+----+-------------+

Game Categories游戏类别

+----+-------------+
| id | name        |
+----+-------------+
|  1 | Recommended |
|  2 | Optional    |
+----+-------------+

I'm done of for first nested for game type relation but i dont know how to add another group by for game categories我已经完成了第一次嵌套游戏类型关系,但我不知道如何为游戏类别添加另一个组

$game_providers = GameProvider::all();

$game_providers = $game_providers->groupBy(function ($game_provider) {
    return $game_provider->game_type->name;
})->all();

and its output及其输出

Array{
 'Chess' => Array{
    0 => Array{
     'id'               => 1,
     'game_name'        => 'Sample',
     'game_type_id'     => 1,
     'game_category_id' => 2
    },
    1 => Array{
     'id'               => 2,
     'game_name'        => 'Sample 0',
     'game_type_id'     => 1,
     'game_category_id' => 2
    },
  },
 'Poker' => Array{
    0 => Array{
     'id'               => 3,
     'game_name'        => 'Sample 1',
     'game_type_id'     => 2,
     'game_category_id' => 1
    },
    1 => Array{
     'id'               => 4,
     'game_name'        => 'Sample 2',
     'game_type_id'     => 2,
     'game_category_id' => 2
    },
  },
}

My expected output我的预期输出

Array{
 'Chess' => Array{
    'Recommended' => Array{
        0 => Array{
           'id'               => 1,
            'game_name'        => 'Sample',
            'game_type_id'     => 1,
            'game_category_id' => 2
        }
    },
    'Optional' => Array{
        0 => Array{
            'id'               => 2,
            'game_name'        => 'Sample 0',
            'game_type_id'     => 1,
            'game_category_id' => 2
        }
    }
  },
 'Poker' => Array{
    'Recommended' => Array{
        0 => Array{
            'id'               => 3,
            'game_name'        => 'Sample 1',
            'game_type_id'     => 2,
            'game_category_id' => 1
        }
    },
    'Optional' => Array{
        0 => Array{
            'id'               => 4,
            'game_name'        => 'Sample 2',
            'game_type_id'     => 2,
            'game_category_id' => 2
        }
    }     
  }
}

With L5, one way of acieving this can be:使用 L5,实现这一点的一种方法可以是:

GameProvider::with('game_categories.game_types')
    ->get()
    ->groupBy([
        'gameTypes.name',
        'gameCategories.name'
    ]);

Should be something along the lines of:应该是这样的:

GameProvider::with('game_categories.game_types')->get()->map(function ($game) {
    return $game->game_categories->groupBy('name')->map(function ($catGame) {
        return $catGame->map(function ($category) {
            return $category->game_types->groupBy('name');
        });
    });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM