Laravel присоединиться только с помощью Eloquent

Есть ли способ в Laravel 4.2 объединить две таблицы, используя только Eloquent? Учтите следующее.

У меня есть игровой стол:

id | slug | name
---|------|------------------
1  | g1   | Game 1
2  | g2   | Game 2

С соответствующей моделью (models / Game.php):

class Game extends Eloquent {

protected $table = 'games';

protected $hidden = array();

public function teams() {
return $this->hasMany('Team');
}
}

У меня есть таблица команд, где каждая команда связана с игрой:

id | slug | name         | game_id
---|------|--------------|--------
1  | t1   | Team 1       | 1
2  | t2   | Team 2       | 1
3  | t3   | Team 3       | 2
4  | t4   | Team 4       | 2

И это модель (models / Team.php):

class Team extends Eloquent {

protected $table = 'teams';

protected $hidden = array();

public function game() {
return $this->belongsTo('Game');
}
}

Теперь я хочу сгенерировать таблицу команд в системе (их может быть тысячи) вместе со связанной игрой teams.game_id знак равно games.id,

id | slug | name   | game
---------------------------
1  | t1   | Team 1 | Game 1
2  | t2   | Team 2 | Game 1
3  | t3   | Team 3 | Game 2
4  | t4   | Team 4 | Game 2

Я могу заставить это работать, используя Eloquent, просто захватывая все команды, используя Team:all(), передав это на мой взгляд и затем сделав следующее:

<h1>Teams</h1>
@if (isset($teams) && $teams->count() > 0)
<table class="table table-striped table-hover table-bordered">
<tr>
<th>#</th>
<th>Slug</th>
<th>Name</th>
<th>Game</th>
</tr>
@foreach ($teams as $t)
<tr>
<td>{{{ $t->id }}}</td>
<td>{{{ $t->slug }}}</td>
<td>{{{ $t->name }}}</td>
<td>{{{ $t->game->name }}}</td>
</tr>
@endforeach
</table>
@else
<p>There are currently no teams stored in the system</p>
@endif

Тем не менее, при таком подходе я неоднократно запрашиваю базу данных для деталей игры для каждой команды, что не идеально. В идеале хотелось бы выполнить один запрос, присоединившись games на teams используя только Eloquent и мои определенные отношения. Есть ли способ, которым я могу сделать все это за один раз, без использования построителя запросов? Я попробовал следующий код, который, кажется, работает, но я не чувствую, что это решение достаточно элегантно:

$teams = Team::leftJoin('games', function($join){
$join->on('teams.game_id', '=', 'games.id');
})
->get(array('teams.id', 'teams.slug', 'teams.name', 'games.name'));

Спасибо,

2

Решение

я думаю Нетерпеливая загрузка будет соответствовать вашим потребностям. Что-то вроде:

Team::with('game')->get()
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]