laravelのモデル結合ルート(show()やedit()の引数が、$idじゃなくて$モデル変数名)について
1 |
php artisan make:model Project --all |
みたいに、コントローラー・モデル・マイグレーションを一気に作ると、コントローラーのshow()やedit()の引数が$idから$モデル変数名に変わっている。
これは、モデル結合ルートと言って、$idで渡すとfindやwhereで検索コードを書かないと行けない所が、urlから$idを渡しておけば自動的に取得した状態でメソットに渡されるらしい(対応するレコードがない場合は404エラー)
便利といえば便利なんだけど、いくつか制限があって
https://localhost/project/1
で、プロジェクトレコードを表示させる時は、暗黙的にprojectsテーブルのID=1のレコードを取得してくれるが
1 2 |
// https://localhost/aaa/1 Route::resource('aaa', 'ProjectController'); |
php artisan route:listで以下のように表示されてる
1 |
GET|HEAD | aaa/{aaa} | aaa.show | App\Http\Controllers\ProjectController@show | web | |
みたいなルーティングの場合は駄目みたい(get引数の1に当たる{aaa}が、Projectモデルと名前が一致していないから)
対処(明示的な結合)としては2つあって
1, resourceとは別に、web.phpに追加
1 2 |
//{project}を使い,対応するテーブルの名前はprojecs、主キーはid Route::get('/aaa/{project}','ProjectController@show'); |
2, {project}の別名に{aaa}を追加する
1 2 3 4 5 6 7 |
// app/Providers/RouteServiceProvider.php public function boot() { parent::boot(); Route::model('aaa', Project::class);//これを追加 } |
1 2 3 4 |
// https://localhost/aaa/1 Route::resource('aaa', 'ProjectController'); {"id":1,"project_name":"abc","created_at":"2019-07-08 02:44:36","updated_at":"2019-07-08 02:44:36"} |
php artisan route:listで以下のように表示されるが、{project}が割り当てられる。元のproject/{project}も普通に使える。
1 2 3 4 5 6 |
POST | aaa | aaa.store | App\Http\Controllers\ProjectController@store | web | GET|HEAD | aaa/create | aaa.create | App\Http\Controllers\ProjectController@create | web | GET|HEAD | aaa/{aaa} | aaa.show | App\Http\Controllers\ProjectController@show | web | PUT|PATCH | aaa/{aaa} | aaa.update | App\Http\Controllers\ProjectController@update | web | DELETE | aaa/{aaa} | aaa.destroy | App\Http\Controllers\ProjectController@destroy | web | GET|HEAD | aaa/{aaa}/edit | aaa.edit | App\Http\Controllers\ProjectController@edit | web | |
まあ、基本的にURLパスとテーブル名は一致させましょう!って事なんだろうけどね…。
ちなみに、idカラム以外をキーに使いたい時は、以下のメソッドをモデルファイルに追加する
1 2 3 4 |
public function getRouteKeyName() { return 'hash_key'; } |