私はLaravelにかなり慣れていません。私はまだそれを学ぼうとしています。私の質問は:
名前の付いた3つのテーブルがあります
game_platforms
これらのテーブルには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を紹介するだけでしたか、私にはあまりにも進んでいました。
これについて以前にコメントを残しましたが、今ではそれがあなたが探している答えであると確信しています。belongsToMany
ではなくhasManyThrough
を使用する必要があります。したがって、最初に、Laravelの規則(複数のsnake_caseテーブル名、単一のsnake_caseアルファベット順のピボットテーブル名、単一のStudlyCapsモデル名)に従うようにテーブルとモデルの名前を変更することをお勧めします。そうすると、次の状況になります。
テーブル:
これで、新しい構造に準拠するようにモデルを書き直し、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();
次のようにテーブルをモデル化する必要があります。
**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');
}
}
これは、ゲームプラットフォームがゲームオプションを通じてゲームに属していることを前提としています。