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'); // コントローラ名を変更