😊

知らなかった!モデル作成時の便利なオプション大公開!(laravel)

2021/04/05に公開

今回はモデル作成する際によく使うコマンド php artisan make:model のオプションについて説明したいと思います。

Laravelのなんかのmedium(海外のブログ・サイト)の記事を見ていたときに、なんかこの人モデル作成する際にいろんなオプションつけてるぞ?なんだこれは?と疑問に思って調べてみたので、記事に残しておきたいと思います!

モデル作成時のオプションの確認方法

hオプションを渡すと、どんなオプションがあるのか確認できます。
hはたぶん「ヘルプ(help)」のhだと思います。

$ php artisan make:model -h

「c」は普通のControllerを作れます

cオプションを試してみます。

$ php artisan make:model Item -c
Model created successfully.
Controller created successfully.

【作成されたファイル】

  • app/Models/Item.php
  • app/Http/Controllers/ItemController.php

作成されたモデルとControllerは普通でした(当たり前か)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    use HasFactory;
}
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ItemController extends Controller
{
    //
}

「r」オプションでCRUDを兼ね備えたControllerを作れます

$ php artisan make:model Item -r       
Model created successfully.
Controller created successfully.

【作成されたファイル】

  • app/Models/Item.php
  • app/Http/Controllers/ItemController.php

先程のcオプションと違うのはContollerの中身です。
resourcesを指定したときに出てくるControllerの中身になっています。

<?php

namespace App\Http\Controllers;

use App\Models\Item;
use Illuminate\Http\Request;

class ItemController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function show(Item $item)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function edit(Item $item)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Item $item)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function destroy(Item $item)
    {
        //
    }
}

「api」オプションでAPIのCRUD用のControllerが出てきます

$ php artisan make:model Item --api
Model created successfully.
Controller created successfully.

【作成されたファイル】

  • app/Models/Item.php
  • app/Http/Controllers/ItemController.php

これもまた先程のcオプションやrオプションと違うのはContollerの中身です。
APIのCRUDのテンプレみたいなファイルが出てきます。

<?php

namespace App\Http\Controllers;

use App\Models\Item;
use Illuminate\Http\Request;

class ItemController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function show(Item $item)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Item $item)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function destroy(Item $item)
    {
        //
    }
}

「f」でファクトリも一緒にを作れます

$ php artisan make:model Item -f
Model created successfully.
Factory created successfully.

【作成されたファイル】

  • app/Models/Item.php
  • database/factories/ItemFactory.php

作成されたファクトリはこんな感じです(まあ普通のファクトリです)
Laravel8からまたファクトリの使い方が変わったので、Laravel8未満ユーザーは見慣れない感じかと思います。

<?php

namespace Database\Factories;

use App\Models\Item;
use Illuminate\Database\Eloquent\Factories\Factory;

class ItemFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Item::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            //
        ];
    }
}

「m」 オプションでマイグレーションファイルも作っちゃう

$ php artisan make:model Item -m
Model created successfully.
Created Migration: 2021_03_28_235925_create_items_table

【作成されたファイル】

  • app/Models/Item.php
  • database/migrations/2021_03_28_235925_create_items_table.php

通常のマイグレーションファイルと同様に、年月日とかでファイル名変わるのでそこは柔軟にお願いします。同じコマンドを打ったからといって↑と全く同じファイル名は出てきませんので。。。

作成されたマイグレーションはこんな感じです。
マイグレーションファイルもちょこちょこ変わっていて、主キーのidは $table->id() と指定するようになっていたりするのですが、それもバージョンによって違います。laravel8だとこういうふうに出てきます。

<?php

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

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

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

「s」オプションでシーダーも作れます!

$ php artisan make:model Item -s
Model created successfully.
Seeder created successfully.

【作成されたファイル】

  • app/Models/Item.php
  • database/seeders/ItemSeeder.php

出てきたシーダーファイルはこんな感じ

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class ItemSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

「p」オプションで Pivotを継承したモデルを作成!!

 php artisan make:model Item -p
Model created successfully.

pオプションはモデルしか作成されませんが、普通のモデルではなく、pivotを継承したモデルを作成できます。

Pivotは中間テーブルを作るときにめちゃくちゃ便利なのですが、今まで普通にモデル作ってからPivotを使用するように手で書き換えていたので、このオプションはめっちゃ嬉しいですね。

生成されたモデルはこんな感じです。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\Pivot;

class Item extends Pivot
{
    //
}

モデルとファクトリとコントローラとマイグレーションを全部作っちゃう「a」オプション

一番最強オプション「a」オプションです。全部作れちゃいます。

$ php artisan make:model Item -a  
Model created successfully.
Factory created successfully.
Created Migration: 2021_03_29_001215_create_items_table
Seeder created successfully.
Controller created successfully.

【作成されたファイル】

  • app/Models/Item.php
  • database/migrations/2021_03_28_235925_create_items_table.php
  • database/factories/ItemFactory.php
  • app/Http/Controllers/ItemController.php
  • database/seeders/ItemSeeder.php

ちなみにこの場合のControllerは普通のContorllerということに注意です

終わりに

他にもいくつかオプションはあるのですが、個人的にはそんなに使わないものなので省略しました。関連するファイル生成系のみ全部紹介したので、他のオプションが気になる方は「h」オプションで確認してみてください!

ちなみに、ドキュメントにはmオプションしか紹介されておらず、今回は新しい発見が多かったです。
オプションを有効活用して日々の面倒な作業をどんどん効率よくしていけると最高ですね!

Discussion