【发布时间】:2019-09-09 16:08:15
【问题描述】:
我一直在使用 Laravel REST API 开发一个 Angular 应用程序,并意识到我的关系并不像应有的那样。
我有 3 个实体 - seasons、divisions 和 teams。
季节:
一个赛季有很多部门,很多团队。
部门:
一个部门属于多个赛季,有多个球队。
团队:
一支球队属于多个部门,属于多个赛季。
这是因为分区可能不会用于每个赛季,球队可能会在每个赛季更换分区,或者可能不会在所有赛季中都进行比赛。
我很难理解如何实现关系逻辑。
例如,我想获取一个赛季的分区以及该分区中该特定赛季的球队,无论是当前赛季还是当用户观看旧赛季时。
这是我目前所拥有的:
季节模型
class Season extends Model
{
protected $guarded = [];
protected $hidden = ['pivot'];
/**
* Return divisions for this season
*
* @return BelongsToMany
*/
public function divisions()
{
return $this->belongsToMany('App\Division');
}
public function teams()
{
return $this->belongsToMany('App\Team');
}
}
部门模型
class Division extends Model
{
protected $guarded = [];
public function matches()
{
return $this->hasMany('App\Fixture');
}
public function seasons()
{
return $this->belongsToMany('App\Season');
}
public function teams() {
return $this->hasMany('App\Team');
}
}
团队模型
class Team extends Model
{
protected $guarded = [];
protected $hidden = ['pivot'];
public function division() {
return $this->belongsTo('App\Division');
// should be belongsToMany
}
public function seasons()
{
return $this->belongsToMany('App\Season')->select('season_id');
}
}
有以下表格:
- 季节
- 部门
- 团队
- division_season
- season_team
但这并不能让我在每个赛季都有一支属于不同部门的球队。
如果我将团队模型上的 division() 方法更改为 divisions() 并使用 belongsToMany() 并有一个新表 - Division_team(这是正确的方法吗?)我将如何通过他们的按赛季划分?
例如:
Get all divisions and their teams by season id
记住球队每个赛季都有可能改变分区。
编辑
根据下面 Thomas Van Der Veen 的回答,我添加了一个表 division_season_team 并在他的回答中使用了关系。
尽管尝试根据赛季 ID 与他们的球队划分分区是很困难的 - 下面会返回正确的分区,但球队不一定是当前赛季的一部分!
DivisionsController
if ($request->query('seasonId')) {
$seasonId = $request->query('seasonId');
return $this->respond(new DivisionCollection(Division::with('teams')->whereHas(
'seasons', function($q) use ($seasonId) {
$q->where('season_id', '=', $seasonId);
})->get()
));
}
【问题讨论】:
-
@kerbholz 显然 HasManyThrough 不适用于多对多关系
-
我建议多对多的关系,因为这样可以避免你的困惑
-
@AthulRaj 我正在使用多对多关系 - 查看上面提供的所有代码以及我所做的编辑 - 你在哪里看到与非多对多关系有任何关系?
-
@DJC 我认为你需要使用Many To Many (Polymorphic) Relationship。
-
是的,我仍然看到非多对多的关系。在划分模型中有两个hasMany关系。您也可以将其更改为多对多。如果所有这些模型都是多对多相关的并且具有数据透视表。我相信在你的情况下一切都会好起来的
标签: php laravel eloquent many-to-many