在 Laravel 5 中具有父子关系的 belongsToMany
belongsToMany with parent-child relationship in Laravel 5
我有两个模型,它们以 belongsToMany
关系相互关联。模型是 Game
和 Category
。当然,两者的 table 是 games
和 categories
。 Category
模型有自己的父子关系。
基本上这是我的 "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;
}
}
如果不行请告诉我
我有两个模型,它们以 belongsToMany
关系相互关联。模型是 Game
和 Category
。当然,两者的 table 是 games
和 categories
。 Category
模型有自己的父子关系。
基本上这是我的 "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;
}
}
如果不行请告诉我