Laravel 隐式路由,使用firstOrCreate代替findOrFail

Laravel 隐式路由,使用firstOrCreate代替findOrFail,laravel,laravel-5,laravel-routing,laravel-5.5,Laravel,Laravel 5,Laravel Routing,Laravel 5.5,是否可以创建一个隐式路由,如果找不到它,则创建该对象?我使用的是Laravel 5.5.13 例如,这是我的隐式路线: Route::post('thumbs/{player}', 'ThumbController@store'); 在我的控制器中是这样的: public function store(Request $request, Player $player) { $thumb = new Thumb($request->all()); $player->t

是否可以创建一个隐式路由,如果找不到它,则创建该对象?我使用的是Laravel 5.5.13

例如,这是我的隐式路线:

Route::post('thumbs/{player}', 'ThumbController@store');
在我的控制器中是这样的:

public function store(Request $request, Player $player)
{
    $thumb = new Thumb($request->all());
    $player->thumbs()->save($thumb);
    return response()->json($thumb, 201);
}
现在,如果我转到
…/api/thumb/1
的端点,它将创建一个与id
1
Player
相关的thumb。但是,我希望为其提供如下字符串,而不是id号:

..../api/thumb/PLAYER_NAME
Route::bind('player', function ($value) {
   if ($player = \App\Player::find($value)) {
      return $player;
   }

   return Player::create(['name' => $value]);
});

例如,
…/api/thumb/Blagoh
,那么我的端点应该首先找到一个名为“Blagoh”的播放器是否存在,如果它不存在,那么它应该创建它。我想不出这一点。

您应该做的是在
路由服务提供商的
引导方法中添加如下内容:

..../api/thumb/PLAYER_NAME
Route::bind('player', function ($value) {
   if ($player = \App\Player::find($value)) {
      return $player;
   }

   return Player::create(['name' => $value]);
});

它被称为显式绑定,您可以如上所示更新逻辑

超级酷,非常感谢!
\App\Player::find($value)
如何知道如何按
名称搜索?@Blagoh它不会-在您的示例中,您显示的值可以是1,在本例中,搜索是按id进行的。如果您想按名称查找,
first或create
可能是更好的选择哦,哈哈!谢谢你这么快的回复!:)