Laravel显示路线中的返回关系

时间:2019-05-03 14:00:48

标签: php laravel

当我创建一个CRUD控制器时,这是默认创建的表演路线:

/**
 * Display the specified resource.
 *
 * @param  \App\Team  $team
 * @return \Illuminate\Http\Response
 */
public function show(Team $team)
{
    //
}

$team是此处的对象,是Team的实例。如果这样做,我会将正确的对象传递给刀片服务器:

public function show(Team $team)
{
    return view('admin.teams.show', ['team' => $team]);
}

但是,Team与另一个称为Player的模型具有多对多关系,并且这种关系是从Team端定义的:

public function players() {
    return $this->belongsToMany(Player::class);
}

在我的show方法中,我想将$ team及其相关的玩家退还给我们。但是由于$ team已经是一个对象而不是查询生成器,所以现在做类似的事情已经太晚了

$team->with('players')

那么我该如何吸引相关玩家?我知道我可以做类似的事情:

public function show(Team $team)
{
    $team_extended = Team::where('id', $team['id'])->with('players')->first();
    return view('admin.teams.show', ['team' => $team_extended]);
}

但是感觉就像在破解默认情况下应该存在的功能。是否有内置的Laravel方法可以做到这一点?还是我只是在发明热水,并应该采用上面在我的解决方案中使用的方法?

1 个答案:

答案 0 :(得分:1)

如果您已经加载了Team模型,则可以加载关系,而不必使用->load()方法完全重新创建它:

public function show(Team $team){
  $team->load("players");
  return view("admin.teams.show", ["team" => $team]);
}

但是请注意,除非您需要修改$team->players的默认内容,否则这不是必需的。当您尝试在$team->players视图中访问admin.teams.show时,如果该属性尚不存在(如使用->with(["players"])->load("players")的方式,Laravel将自动加载该属性