1

我现在正在学习 Laravel 和 Laravel 雄辩,现在我尝试使用 Laravel 中的关系来解决问题。这是我要归档的内容:

该数据库包含许多体育俱乐部。体育俱乐部有很多球队。每支球队都有比赛。团队表有一个名为 的列club_id。现在我想创建 Eloquent 关系以获取俱乐部的所有游戏。

这是我到目前为止得到的:

俱乐部模型

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 错误,即 games 表没有名为 的列club_id

创建这种关系的正确方法是什么?

谢谢!

编辑

感谢 Nikola Gavric,我找到了获得所有比赛的方法——但仅限于俱乐部球队是主队或客队的情况。

这是关系:

public function games()
    {
        return $this->hasManyThrough('App\Models\Game','App\Models\Team','club_id','home_id');
    }

如何获得 home_id 或 guest_id 与俱乐部球队匹配的比赛?此函数中的最后一个参数不允许使用数组。

4

3 回答 3

2

有一种方法可以检索“与中介的遥远关系”,它被称为Has Many Through

还有一个关于如何使用它的具体示例,其中包括Post,CountryUser,但我认为它足以为您提供有关如何在模型games内部创建关系的提示。是一个链接,但是当您打开它时,搜索关键字,您会看到一个示例。ClubhasManyThrough

PS:keys naming你可以通过以下方式实现它:

public function games()
{
    return $this->hasManyThrough('App\Models\Games', 'App\Models\Teams');
}

编辑#01

由于您有 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');
}

编辑#02

合并关系:要合并这两个关系,您可以merge()在实例上使用方法Collection,它会做的是,它将第二个集合中的所有记录附加到第一个集合中。

$gamesHome = $model->gamesAsHome;
$gamesGuests = $model->gamesAsGuests;
$games = $gamesHome->merge($gamesGuests);

return $games->unique()->all();

感谢@HCK 指出您在合并后可能有重复,这是在合并后获得独特游戏unique()所必需的。


编辑#03

sortBy在contains的情况下还提供 acallable而不是 a 。你可以这样排序:attribute nameCollectionnumerical indexingCollection

$merged->sortBy(function($game, $key) {
    return $game->created_at;
});
于 2019-01-24T13:20:11.620 回答
0

当您定义 ClubhasMany游戏时,您表示该游戏有一个称为club_id指向 Club 的外键。belongsTo是相同的,但以另一种方式。这些需要与您在数据库中的内容保持一致,这意味着您需要将这些键定义为表上的外键。

于 2019-01-24T13:10:55.117 回答
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();
于 2019-01-24T13:15:06.200 回答