我现在正在雄辩地学习Laravel和Laravel,现在我尝试使用Laravel中的关系来解决问题。 这就是我要存档的内容:
该数据库包含许多体育俱乐部。一个体育俱乐部有很多球队。每个团队都有比赛。 teams表具有名为club_id
的列。现在,我想创建雄辩的关系以获取俱乐部的所有比赛。
这是我到目前为止所得到的:
俱乐部模型
id => PRIMARY
public function games()
{
return $this->hasMany('App\Models\Games')->whereHas('homeTeam')->orWhereHas('guestTeam');
}
游戏模型
home_id => FOREIGN KEY of team ; guest_id => FOREIGN KEY of team
public function homeTeam()
{
return $this->belongsTo('App\Models\Team','home_id')->where('club_id','=', $club_id);
}
public function guestTeam()
{
return $this->belongsTo('App\Models\Team','guest_id')->where('club_id','=', $club_id);
}
团队模型
id => PRIMARY ; club_id => FOREIGN
在我的控制器中,我要做的只是Club::findOrFail($id)->games()
执行上面的代码将返回一个SQL错误,即游戏表没有名为club_id
的列。
建立这种关系的正确方法是什么?
谢谢!
编辑
感谢Nikola Gavric,我找到了一种获得所有比赛的方式-但仅在俱乐部队是主队或客队的情况下。
这里是关系:
public function games()
{
return $this->hasManyThrough('App\Models\Game','App\Models\Team','club_id','home_id');
}
如何获得home_id或guest_id与俱乐部球队匹配的比赛?此函数中的最后一个参数不允许使用数组。
答案 0 :(得分:2)
有一种方法可以检索“与中介的远距离关系”,称为Has Many Through。
还有一个关于如何使用它的具体示例,包括Post
,Country
和User
,但我认为这足以为您提供创建方法的提示games
模型内部的Club
关系。 Here是一个链接,但是当您打开它时,搜索hasManyThrough
关键字,您将看到一个示例。
P.S:使用正确的keys naming
,您可以通过以下方式实现:
public function games()
{
return $this->hasManyThrough('App\Models\Games', 'App\Models\Teams');
}
由于您有2种类型的团队,因此可以创建2种不同的关系,每种关系都会使您成为所需的一种类型。像这样:
public function gamesAsHome()
{
return $this
->hasManyThrough('App\Models\Games', 'App\Models\Teams', 'club_id', 'home_id');
}
public function gamesAsGuests()
{
return $this
->hasManyThrough('App\Models\Games', 'App\Models\Teams', 'club_id', 'guest_id');
}
合并关系:要合并这两个关系,您可以在Collection
实例上使用merge()
方法,它将执行的操作是,它将附加所有记录< em>从第二个收藏到第一个。
$gamesHome = $model->gamesAsHome;
$gamesGuests = $model->gamesAsGuests;
$games = $gamesHome->merge($gamesGuests);
return $games->unique()->all();
感谢@HCK指出您在合并后可能会重复,并且unique()
是合并后获得唯一游戏的必需条件。
sortBy
包含callable
的情况下, attribute name
也提供Collection
而不是numerical indexing
。您可以像这样对Collection
进行排序:
$merged->sortBy(function($game, $key) {
return $game->created_at;
});
答案 1 :(得分:0)
定义俱乐部hasMany
游戏时,表示该游戏具有指向俱乐部的名为club_id
的外键。 belongsTo
是相同的,但是相反。这些必须与数据库上的内容保持一致,这意味着您需要将这些键定义为表上的外键。
答案 2 :(得分:0)
尝试一下...
俱乐部模型
public function games()
{
return $this->hasMany('App\Models\Games');
}
游戏模型
public function homeTeam()
{
return $this->belongsTo('App\Models\Team','home_id');
}
public function guestTeam()
{
return $this->belongsTo('App\Models\Team','guest_id');
}
您的查询类似
Club::where('id',$id)->has('games.guestTeam')->get();