代码之家  ›  专栏  ›  技术社区  ›  Tales

Laravel 5中亲子关系的归属

  •  0
  • Tales  · 技术社区  · 6 年前

    我有两个相互关联的模型 belongsToMany 关系这些模型是 Game Category .当然,这两张桌子都是 games categories 这个 类别 模型,具有自己的父子关系。

    基本上这是我的“简化”结构:

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

    这个 parent_id 列为 null 当类别没有父类别,但如果它是其他类别的子类别,则它有一个引用同一表中某行的现有id时。

    Table category_game
    category_id unsigned integer
    game_id     unsigned integer
    

    这个 category_id 列,引用 id 在…上 类别 桌子它应该只引用游戏所属的顶级类别。一个游戏可以属于许多不同的类别,但在透视表中,应该只引用父类别。例如,如果我有这样的类别结构:

    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检索儿童类别。我知道 属于造口 方法有更多的参数可以帮助解决我的问题,但我不知道如何使用它们。

    2 回复  |  直到 6 年前
        1
  •  1
  •   afsal c    6 年前

    表的模型类别名称 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;
         }
    }
    

    如果不起作用,请告诉我

        2
  •  0
  •   Jonas Staudenmeir    6 年前

    扩展您的模型:

    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;