2014-02-19 6 views
9

Я довольно недавно знаком с Laravel. Я все еще пытаюсь это изучить. Мой вопрос:Laravel Eloquent Присоединиться

У меня есть 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} 

Но мне нужно название игры и платформы имена с тех идентификаторов. Дело в том, что я хочу сделать это только красноречиво. Я мог бы пойти с «DB» или oldschool SQL, но я хочу узнать, возможен ли этот способ или нет.

Также я ищу лучшую документацию/книги для laravel. Большинство из того, что я читал, только вводили laravel или слишком продвинуты для меня.

+0

Я мог бы быть вне базы здесь, но я чувствую, что вы используете 'hasManyThrough', когда' ownToMany' будет соответствовать здесь. Я мало знаю о 'hasManyThrough', поэтому вы можете сказать мне, если я ошибаюсь, но, возможно, попробуйте изменить это. По крайней мере, тогда вызов '$ game-> platform()' даст вам 'Collection'' GameOption '' не 'GamePlatform' – alexrussell

ответ

8

Я уже оставлял комментарии об этом, но теперь я уверен, что это ответ, который вы ищете: вы должны использовать belongsToMany, а не hasManyThrough.Итак, во-первых, могу ли я предложить вам переименовать свои таблицы и модели в соответствии с соглашениями Laravel (множественные имена таблиц snake_case, уникальные имена таблиц с именами в виде змеиных символов, уникальные имена моделей StudlyCaps), таким образом, у вас будет следующая ситуация:

Таблицы:

  • игры
    • ID
    • имя
  • game_option
    • ID
    • game_id
    • option_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(); 
+0

Как я уже упоминал выше, мне как-то пришлось вывести значение в ваши данные, так что дайте мне знать, если ваш материал платформы/опции не работает так, как я предполагал, и я продолжу обновлять примеры. – alexrussell

+0

отличное объяснение сводных таблиц! –

2

вы можете использовать with метод с красноречивым

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

Если вернуть вам игры и платформы

Для документации я бы первый начать с documentation при условии (найти его, чтобы быть около 50% полного) и с api все остальное покрыто

1

Вы должны смоделировать ваши таблицы, как:

**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 */ 

Тогда в вашем классе игры:

Теперь, это предполагает, что Game Platform принадлежит к Играм через игровые опции.

Смежные вопросы