#5 コミックステーブルを作る

前回からめちゃめちゃ間が空いてしまった。なんちゅうか、、、子供の夏休み期間な…。忙しかったな…。
何やってたか忘れかけていたけど、そうだった、モデルを作るんだった。夏休みが大変な間に息子のこち亀熱が下がってしまったが、まあ続けてみよう。

まずはルーティングをなんとかするみたい。routes/web.phpを編集する。

Route::get('/', 'IndexController@index')->name('index');

今まで/にアクセスしたら、welcome.blade.phpが表示されていたけど、今度はIndexControllerのindexアクションを通すことにする。nameは別名。リンクのときにこれを指定すればいいんだと。

もちろん、IndexControllerなんてのは存在しないので、作る。

php artisan make:controller IndexController

実はさっき、「phpなんてコマンド、パス通ってないよ〜?」というエラーが出て、んなアホなと思ったわけ。結果的には、php8.1.4へのパスは通してあるけど、アップデートにより消失し、8.1.9になったのに、そちらのパスが通ってなかったというわけだった。

さて、先程のartisanコマンドでIndexControllerができた。
app/Http/Controllers/IndexController.php
もちろん中身はなにもない。ので、indexアクションを追加する。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class IndexController extends Controller
{
    public function index()
    {   
        return view('index');
    }   
}

viewでindexを指示しているので、resources/views/index.blade.phpを表示する。ところが、これで表示するとControllerがdoes not existになってしまう。なんでじゃ〜と思って検索、対応。

app/Providers/RouteServiceProvider.php にnamespaceを追加すればいいらしい。

(略)
    protected $namespace = 'App\Http\Controllers';

    /** 
     * Define your route model bindings, pattern filters, and other route configuration.
     *
     * @return void
     */
    public function boot()
    {   
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::middleware('api')
                ->prefix('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        }); 
    } 

protectedで$namespaceをもたせ、api/webに追加してやった。すると動いた!ヨシャ!

コミックステーブルを作るぞ。

php artisan make:migration create_comics_table --create=comics

これでdatabase/migrations/に、20XX_hogehoeg_create_comics_table.phpというマイグレーションファイルができた。

20XX_hogehoeg_create_comics_table.phpはこんなかんじにした。

<?php

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

return new class extends Migration
{
   /** 
    * Run the migrations.
    *
    * @return void
    */
   public function up()
   {   
       Schema::create('comics', function (Blueprint $table) {
           $table->unsignedBigInteger('id')->primary();
           $table->string('title', 100)->nullable(false);
           $table->string('comment', 300);
           $table->text('amazon'); 
       }); 
   }   

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

IDは1-201巻なので固定のため自動採番したくなかった。こういう場合はunsignedBigInterで、primeryをつけたらよさそう。

はじめ、primeryをつけずにマイグレーションしてしまい主キーが設定されなかったので、安易にphp artisan migrage:refreshしたら、なんと管理画面の管理ユーザデータが飛んでしまった。うそ〜ん。

こちらを参考に、管理画面のユーザーを追加するシーダーを作成した。

すると、migrate:refreshしても難なく動く!ヤター

次に、コミックスのシーダーを作成する

php artisan make:seeder ComicsTableSeeder

一瞬でシーダーができる。でももちろん、データは全然入ってない。そりゃそうよ。わかってるわよ。ここからが地獄の始まりよね。

とりあえずあとで入れるとして、こんなかんじで…

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class ComicsTableSeeder extends Seeder
{   
   /**
    * Run the database seeds.
    *
    * @return void
    */
   public function run()
   {   
       //
       DB::table('comics')->insert(
           [   
               'id' => 1,
               'title' => '早うち両さん!?の巻',
               'comment' => 'hogehoge',
               'amazon' => 'hogehoge',
           ],  
       );  

       DB::table('comics')->insert(
(略)

このシーダーはAdminと同様、最初に実行されてほしいので追記する。

database/seeders/DatabaseSeeder.php

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
   /** 
    * Seed the application's database.
    *
    * @return void
    */
   public function run()
   {   
       $this->call([
           AdminTableSeeder::class,
           ComicsTableSeeder::class,
       ]); 
   }
}

シーダー実行

php artisan db:seed

DBを確認したら、きちんとAdminのユーザデータもコミックスのデータも入っていたのでオッケーオッケー最高ハッピー

んじゃこれをあと…200巻分…やろうかな…。

もし投稿が気に入ってもらえたら、サポートいただけるととても嬉しいです!