在 Laravel 5 中具有父子关系的 belongsToMany

belongsToMany with parent-child relationship in Laravel 5

我有两个模型,它们以 belongsToMany 关系相互关联。模型是 GameCategory。当然,两者的 table 是 gamescategoriesCategory 模型有自己的父子关系。

基本上这是我的 "simplified" 结构:

Table game:
id          unsigned integer
name        string

Table categories:
id          unsigned integer
name        string
parent_id   unsigned integer nullable

当类别没有父类别时,parent_id 列是 null,但如果它是其他类别的子类别,则它有一个引用同一行的现有 ID table类别。

Table category_game
category_id unsigned integer
game_id     unsigned integer

category_id 列,在 categories table 上引用了 id。它应该仅引用游戏所属的顶级类别。一个游戏可以属于许多不同的类别,但在 pivot table 中,应该只有对父类别的引用。例如,如果我有这样的类别结构:

Category 1
  Category 2
    Category 4
  Category 3
    Category 9
Category 5
  Category 6
  Category 7
    Category 8

我想获得有关我的游戏 1 和 2 的以下信息:

category_id  game_id
          3        1
          5        1
          1        2

这应该意味着我的游戏 1 有类别:3、9、5、6、7 和 8。 虽然我的游戏 2 有类别:1、2、4、3 和 9

我知道我的 Laravel 模型应该有这个:

class Game {
    public function categories(){
        return $this->belongsToMany( Category::class );
    }
}

class Category{
    public function games(){
        return $this->belongsToMany( Game::class );
    }
}

但我不知道如何使用 Eloquent 检索子类别。我知道 belongsToMany 方法有更多参数可能有助于解决我的问题,但我不知道如何使用它们。

扩展您的模型:

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

class Game {
    public function getAllCategoriesAttribute() {
        $result = collect();
        $children = function($categories) use(&$result, &$children) {
            if($categories->isEmpty()) return;
            $result = $result->merge($categories);
            $children($categories->pluck('children')->collapse());
        };
        $children($this->categories);
        return $result;
    }
}

然后您可以像这样访问类别:

Game::find($id)->allCategories;

table category_game

的模型类别游戏
class CategoryGame{
 public function childCategories() {
    return $this->hasMany(Category::class, 'parent_id','category_id');
 }
}

您可以访问

$games = App\CategoryGame::all();

foreach ($games as $game ) {
    foreach ($game->childCategories as $category) {
      echo $category->name;
     }
}

如果不行请告诉我