【Laravel6】モデル名（テーブル名）を変更する際の修正箇所

Laravelでモデル名を変更した際に修正する必要がある箇所について。

バージョン：Laravel 6.20.32

## 修正箇所
モデル名の変更に併せて、下記ファイルの修正を行う

- モデル
- マイグレーション
- コントローラ
- ファクトリ※
- シーダ※
- ルーティング

※ファクトリとシーダについては作成している場合のみ修正が必要。

## 修正前後のファイル名
修正前の名称がOrderDetailというモデルを例にあげる。
今回は、モデル名の接頭辞に"D"をつける必要があり、モデル名をOrderDetailからDOrderDetailに変更する。それに応じてテーブル、コントローラなどの命名も変更した。

|  | 修正前 | 修正後 |
| --- | --- | --- |
| モデル名 | OrderDetail | DOrderDetail |
| テーブル名 | order_details | d_order_details |
| コントローラ名 | OrderDetailController | DOrderDetailControllers |
| ファクトリ名 | OrderDetailFactory | DOrderDetailFactory |
| シーダ名 | OrderDetailSeeder | DOrderDetailSeeder |

## モデル
モデルのファイル名を『OrderDetail.php』から『DOrderDetail.php』に変更する。

### DOrderDetail.phpの修正
クラス名OrderDetailをDOrderDetailに変更する。

```
class DOrderDetail extends Model // クラス名を変更
{
    protected $table = 'd_order_details'; 
    // テーブル名をorder_detailsからd_order_detailsに変更
    // ここではテーブル名を明示的に指定しているが、指定しない場合は、
    // クラス名を複数形にして「スネークケース」にしたものが、テーブル名として使用されるので、省略可能

    // 以下、各種メソッド記述
    public function ...
}
```

### DOrderDetailをリレーションするモデル
リレーションをはっている場合、DOrderDetailをリレーションするモデルに記載しているメソッドを下記のように変更。

```
public function order_details()
{
    return $this->hasMany('App\Models\DOrderDetail'); // OrderDetailからDOrderDetailに変更
}
```

## マイグレーション
下記の2つの方法がある。

- もとのマイグレーションファイルを修正する方法
- もとのマイグレーションファイルを残して、新しくマイグレーションファイルを作成し、テーブル名をリネームする方法

### もとのマイグレーションファイルを修正する方法
マイグレーションのファイル名を『作成日時_create_order_details_table.php』から『作成日時_create_d_order_details_table.php』に変更する。

```
class CreateDOrderDetailsTable extends Migration { // クラス名を変更

	/**
	 * Run the migrations.
	 *
	 * @return void
	 */
	public function up()
	{
		Schema::create('d_order_details', function(Blueprint $table) // テーブル名を変更
		{
            $table->bigIncrements('id');
			// 作成するカラムについての記述
		});
	}


	/**
	 * Reverse the migrations.
	 *
	 * @return void
	 */
	public function down()
	{
		Schema::drop('d_order_details'); // テーブル名を変更
	}

}
```

### もとのマイグレーションファイルを残して、テーブル名をリネームする方法
もとのマイグレーションファイルを残して、新しくマイグレーションファイルを作成しテーブル名をリネームする場合は、rename()メソッドを使う。

下記、もとのマイグレーションファイル『作成日時_create_order_details_table.php』のクラス

```
class CreateOrderDetailsTable extends Migration {

	/**
	 * Run the migrations.
	 *
	 * @return void
	 */
	public function up()
	{
		Schema::create('order_details', function(Blueprint $table)
		{
            $table->bigIncrements('id');
			// 作成するカラムについての記述
		});
	}


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

}
```

新しいマイグレーションファイルを作成

```
php artisan make:migration rename_order_details_table
```

下記、新しいマイグレーションファイル『作成日時_rename_order_details_table.php』のクラス

```
class RenameOrderDetailsTable extends CreateOrderDetailsTable // もとのクラスからリネーム用の拡張クラスを作成
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::rename('order_details', 'd_order_details'); // rename()メソッドでテーブル名を変更
    }

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

### 再度マイグレーションして確認

```
php artisan migrate:fresh
```

## コントローラ
ファイル名を『OrderDetailController.php』から、『DOrderDetailController.php』に変更する。

```
use App\Models\DOrderDetail; // 読み込むモデル名を変更
                             // 他のコントローラでもDOrderDetailモデルを読み込んでいる場合は、そのコントローラの記述も上記と同様に変更

class DOrderDetailController extends Controller // クラス名を変更
{
    // メソッド記述
}
```

## ファクトリ、シーダ
ファクトリ、シーダを作成している場合は、
ファイル名をそれぞれ、『DOrderDetailFactory.php』、『DOrderDetailSeeder.php』に変更する。

### ファクトリ DOrderDetailFactory.php

```
use App\Models\DOrderDetail; // モデル名を変更
use Faker\Generator as Faker;

$factory->define(DOrderDetail::class, function (Faker $faker) {
    return [
        // 各カラムにダミーデータ投入
    ];
});
```

### シーダ DOrderDetailSeeder.php

```
class DOrderDetailSeeder extends Seeder // クラス名を変更
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Models\DOrderDetail::class, 1)->create(); // モデル名を変更
    }
}
```

### シーダ DatabaseSeeder.php
DatabaseSeeder.phpにて、複数のシーダを一気に実行している場合は、それも修正。下記の例では50回ループで実行している。

```
class DatabaseSeeder extends Seeder
{

    /**
     * Seed the order relation database.
     *
     * @return void
     */
    public function makeOrder(int $count){
        for ($i = 0; $i < $count; $i++){
            $this->call([
                DOrderDetailSeeder::class, // シーダ名を変更
                // 他にループさせるシーダもここに記載
            ]);
        }
        return;
    }

    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            // 一度のみ実行するシーダをここに記述
        ]);
        $this->makeOrder(50); // 上記のmakeOrderメソッドを50回実行
    }
}
```

## ルーティング
ルーティング（routes/web.php）にコントローラの記述がある場合は修正。

```
Route::get('/order', 'Order\DOrderDetailController@index')->name('order_detail'); // コントローラ名を変更
```