Есть ли способ в 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'));
Спасибо,
я думаю Нетерпеливая загрузка будет соответствовать вашим потребностям. Что-то вроде:
Team::with('game')->get()
Других решений пока нет …