Laravel Eloquent加入

Gea*_*rtz 9 php join laravel eloquent

我对Laravel很新.我还在努力学习它.我的问题是:

我有3个名为的表

  • 游戏
  • game_options
  • GAME_PLATFORMS

    在此输入图像描述

我有3个模型用于那些表

所以,当我这样做

$game = Game::find(1)->platforms;
Run Code Online (Sandbox Code Playgroud)

它只显示,

{"id":1,"platform_id":20,"game_id":1}
{"id":1,"platform_id":21,"game_id":1}
{"id":1,"platform_id":22,"game_id":1}
{"id":1,"platform_id":23,"game_id":1}
{"id":1,"platform_id":24,"game_id":1}
Run Code Online (Sandbox Code Playgroud)

但我需要这些ID的游戏名称和平台名称.问题是,我只想以雄辩的方式做到这一点.我可以使用"DB"或oldschool SQL,但我想知道这种方式是否可行.

另外,我正在寻找更好的laravel文档/书籍.我读到的大多数内容只是为我介绍了laravel或者太过先进.

ale*_*ell 8

我之前就此发表评论,但现在我很确定这是你正在寻找的答案:你应该使用belongsToMany而不是hasManyThrough.首先,我建议你重命名你的表和模型,以遵循Laravel的约定(复数snake_case表名,奇异的snake_case字母顺序数据透视表名,单数StudlyCaps模型名),这样你就会遇到以下情况:

表:

  • 游戏
    • ID
    • 名称
  • game_option
    • ID
    • game_id
    • option_id
  • 选项
    • ID
    • 选项
    • 名称

现在,您可以重写模型以符合新结构,并使用belongsToMany关系:

class Game extends Eloquent
{
    public function platforms()
    {
        return $this->belongsToMany('Option');
    }
}

class Option extends Eloquent
{
    public function platforms()
    {
        return $this->belongsToMany('Game');
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:game_option除非在数据透视表上存储额外数据,否则不必为数据透视表()建模.

现在你应该很好地获得给定游戏的所有选项:

$options = Game::find(1)->options;
Run Code Online (Sandbox Code Playgroud)

或者如果你需要获得所有平台(虽然我试图在这里推断你的代码对选项和平台的意义):

$platforms = Game::find(1)->options()->whereOption('platform')->get();
Run Code Online (Sandbox Code Playgroud)