Laravel:Route Wildcards - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
之前有分享過Laravel wildcards的使用,除了可以最簡單的傳值,也可以透過id取得整個model。
像這樣:
Route('/users/{user}'[App\Http\Controllers\UsersController, 'show']);
只要wildcard那是id,且controller的方法有定義輸入參數是對應model(下面例子是User),這就可以取得整個model。
public function show(User $user) //這邊要定義輸入是你要的model,這邊是User
{
return $user // 會是一個user model
}
這幾天學到可以不用透過id,而是透過其他欄位取得model的方法。
這個方法很簡單,就是透過修改物件導向父類別中的一個方法(function)就行了!
以User為例,在User.php
中新增以下方法,並回傳想要透過哪個欄位取得model,例如使用name
public function getRouteKeyName()
{
return 'name';
}
這樣就完成了!
現在來測試看看,假設User的第一筆資料(id:1)的名字是Amy,
如果原本是靠id取得整個model,像這樣:https://example/users/1
,
可以變成輸入name取得model,像這樣:https://example/users/AmyChen
。
取得輸入的
public function foo($bar)
{
return $bar
}
取得整個model(預設輸入id)
public function foo(Model $bar)
{
return $bar
}
取得整個model(自定義要依什麼欄位找)
public function foo(Model $bar)
{
return $bar
}
跟上面一樣,但要model裡要複寫掉原本的設定。
public function getRouteKeyName()
{
return 'desiredColumnName';
}