如何使用中介连接Laravel中的表?

时间:2017-04-24 15:56:49

标签: php mysql database laravel laravel-5

我最近开始与Laravel合作,我希望真正开始深入研究它及其所有的力量。我目前正在尝试做一些相当简单的事情,将玩家与他们相应的统计数据配对。我的数据库中有3个类和相应的表:

Player 
Stats 
PlayerStatsLink

PlayerStatsLink表有一个'player_id'和一个'stats_id'列,用于将每个玩家与其对应的统计数据相关联。我有点困惑的地方是如何在这种情况下使用belongsTo和hasOne方法与链接。现在这是我的课程的样子:

Player.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Player extends Model
{
    public function stats() 
    {

        return $this->hasOne('App\Stats');

    }
}

Stats.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Stats extends Model
{
    public function players() 
    {

        return $this->belongsTo('App\Player');

    }
}

我很困惑如何将我的链接类合并到混合中,即使我很确定根据我对数据库和结构的了解做正确的事情。我已经考虑过将一个player_id列添加到Stats表中,以使我现在能够正常工作,但我不确定这是否是正确的方法。

在PlayerStatsLink将播放器与相应的统计数据相关联后,我希望能够访问此数据的方式如下:

{{ $player->stats->points }}

1 个答案:

答案 0 :(得分:1)

好的,我们假设您有3个模型:UserStatGameLog。我建议你为你的模型使用单数名称,以避免任何混淆。

让我们从创建它们开始:

php artisan make:model --migration Stat

创建统计模型和统计表。

php artisan make:model --migration GameLog

创建GameLog模型和game_logs表。

这是创建模型和表格并将它们绑定在一起并避免拼写错误的最简单方法。用户模型和相应的表格带有新的laravel安装。

你在User模型中

public function gameLogs(){
    return $this->hasMany(GameLog::class);
}

public function stats(){
    return $this->hasManyThrough(Stat::class, GameLog::class);
}
GameLog模型中的

public function user(){
    return $this->belongsTo(User::class); // each gamelog belongs to just one user
}

public function stat(){
    return $this->hasOne(Stat::class);
}

然后在你的Stat模型中:

public function gameLog(){
    return $this->belongsTo(GameLog::class);
}

请记住也构建数据库。如果您遇到问题,请告诉我,我会帮助您。

现在,如果您想查询用户gamelogs,您只需:

$user = User::find(1);
$gamelogs = $user->gameLogs;

由于$user有许多gamelogs,您需要通过它们进行迭代:

foreach(gamelogs as gamelog){
    //do your logic
}

如果您要加载stat relationship gamelog并使用它,请阅读laravel文档中的eager-loading部分并了解相关信息。

我希望解释清楚而且足够。如果没有,请告诉我。但我建议更好的数据库结构。我认为最好将stats table和game_logs表合并在一起并省略模型GameLog或Stat。实际上它完全一样。