#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巻分…やろうかな…。