Larvel-有一个或多个其他关系的口才关系

时间:2019-01-24 13:06:03

标签: laravel eloquent eloquent--relationship

我现在正在雄辩地学习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与俱乐部球队匹配的比赛?此函数中的最后一个参数不允许使用数组。

3 个答案:

答案 0 :(得分:2)

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

还有一个关于如何使用它的具体示例,包括PostCountryUser,但我认为这足以为您提供创建方法的提示games模型内部的Club关系。 Here是一个链接,但是当您打开它时,搜索hasManyThrough关键字,您将看到一个示例。

P.S:使用正确的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

合并关系:要合并这两个关系,您可以在Collection实例上使用merge()方法,它将执行的操作是,它将附加所有记录< em>从第二个收藏到第一个

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

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

感谢@HCK指出您在合并后可能会重复,并且unique()是合并后获得唯一游戏的必需条件。


编辑#03

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();