LoginSignup
2
0

More than 3 years have passed since last update.

Laravel7でのRoute Model Bindingの新機能を使ってみた

Posted at

Route Model Bindingとは

自分は暗黙の結合やルートモデル結合と良く言っています
今までのLaravelでのルートモデル結合ではidを指定する感じでした
下記のような感じです

ルートでこのように定義して
web.php
Route::get('/user/{user}', 'UserController@index');

コントローラーでこんな感じ

UserController.php
public function index(User $user)
{
    //
}

これでブラウザから/user/1などど叩くとUserモデルのidが1のモデルと勝手に結合してくれるものでした
これかLaravel7では新しくid以外のものを指定してできるようになってました

ルートモデル結合について詳しくはこちらをご覧ください→こちら

id以外のフィールドを指定する

id以外のフィールドを指定してルートモデル結合するにはこんな感じで書きます

web.php
Route::get('/user/{user:name}', 'UserController@index');

これで/user/{任意の名前}でURLを叩くことで
その{任意の名前}と一致するUserが結合して所得することができるようになっています

実際にサンプルを作ってみました

サンプルを作成する

まずはモデル、コントローラー、シーダ、マイグレーションを作成します

$ php artisan make:model Person --all

次にコントローラーですがリソースコントローラーが作成されていますが今回は使わず
別でコントローラーを作成します

$ php artisan make:controller PersonController

シーダファイルを編集します

PersonSeeder.php
<?php

use Illuminate\Database\Seeder;

class PersonSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $param = [
            'name' => '太郎'
        ];

        DB::table('people')->insert($param);

        $param = [
            'name' => '花子'
        ];

        DB::table('people')->insert($param);

        $param = [
            'name' => '次郎'
        ];

        DB::table('people')->insert($param);
    }
}

マイグレーションの編集をします

create_people_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePeopleTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('people', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('people');
    }
}

マイグレーション実行とシーダの実行をします

$ php artisan migrate
$ php artisan db:seed

これでDBとダミーデータの用意ができました
次にbladeファイルを作成します

resourcesmainフォルダを作成してindex.blade.phpを作成してください
index.blade.phpを下記のように編集しておきます

index.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ユーザー表示</title>
</head>
<body>
    {{ $person->name }}
</body>
</html>

web.phpを編集します
下記を追加

web.php
Route::get('/{person:name}', 'MainController@index');

コントローラーを変更します
MainController.phpに下記のアクションを追加してください

MainController.php
    public function index(Person $person)
    {
        return view('main.index', compact('person'));
    }

完了です

これでブラウザから/太郎としてみてください
ブラウザに太郎と表示されていると思います

今回はnameフィールドでバインドするように指定しているので
Personモデルに一致するnameをURLに指定してアクセスすると
一致したPersonの情報が所得できています

今までのようにidのみでなく
ルート定義の際にあんなに簡単にフィールドを指定してルートモデル結合できるのは
とても便利ですね

色々な使い方ができるなと思いました
使い方考えながら遊んでみようと思います

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0