web-dev-qa-db-ja.com

Laravel Eloquent Join

私はLaravelにかなり慣れていません。私はまだそれを学ぼうとしています。私の質問は:

名前の付いた3つのテーブルがあります

  • ゲーム
  • game_options
  • game_platforms

    enter image description here

これらのテーブルには3つのモデルがあります

  • ゲームモデル

    class Game extends Eloquent
    {
        protected $table = 'games';
    
        public function platforms()
        {
            return $this->hasManyThrough('GamePlatform','GameOptions','id','game_id');
        }
    }
    
  • GamePlatformモデル

    class GamePlatform extends Eloquent
    {
        protected $table = 'game_platform';
    }
    
  • GameOptionモデル

    class GameOptions extends Eloquent
    {
        protected $table = 'game_options';
    }
    

だから私がするとき

$game = Game::find(1)->platforms;

表示するだけです、

{"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}

ただし、これらのIDを持つゲーム名とプラットフォーム名が必要です。事は、私は雄弁だけでこれをやりたいということです。 「DB」またはオールドスクールSQLを使用することもできますが、この方法が可能かどうかを知りたいと思います。

また、laravelのより良いドキュメント/本を探しています。私が読んだもののほとんどは、laravelを紹介するだけでしたか、私にはあまりにも進んでいました。

9
Geartz

これについて以前にコメントを残しましたが、今ではそれがあなたが探している答えであると確信しています。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');
    }
}

注:ピボットテーブルをモデル化する必要はありません(game_option)ピボットに追加のデータを保存しない限り。

これで、特定のゲームのすべてのオプションを取得できるようになります。

$options = Game::find(1)->options;

または、すべてのプラットフォームを取得する必要がある場合(オプションとプラットフォームに関してここでコードの意味を推測しようとしていますが):

$platforms = Game::find(1)->options()->whereOption('platform')->get();
8
alexrussell

with メソッドを雄弁に使用できます

$game = Game::where('id',1)->with('platforms')->get();

ゲームとプラットフォームを返す必要があります

ドキュメントについては、最初に ドキュメント が提供され(約50%完了していることがわかります)、 api 他のすべてがカバーされています。

3
AbstractChaos

次のようにテーブルをモデル化する必要があります。

**games**
id
name

**game_options**
id
game_id
name

**game_platform**
id
game_options_id
platform_id  /* which i assume you get from a platform master table */

次に、ゲームクラスで:

class Game extends Eloquent
{
    protected $table = 'games';

    public function platforms()
    {
        return $this->hasManyThrough('GamePlatform','GameOptions','game_id','game_options_id');
    }
}

これは、ゲームプラットフォームがゲームオプションを通じてゲームに属していることを前提としています。

1
arrigonfr