blade系package(3-3) laravel-form-components チェックボックス等
の続き
チェックボックス(単一)
このパターンは複数チェックボックスと単一チェックボックスの2つに別れるが今回は単一のみ。このパターンは大抵DBにbool型を持っている奴である。重要か重要でないかflag is_important を定義してみよう
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->boolean('is_important'); // これ
$table->timestamps();
});
<x-guest-layout>
<!-- Session Status -->
<x-auth-session-status class="mb-4" :status="session('status')" />
<x-form action="{{ route('posts.store') }}" class="mb-3">
<x-form-input name="title" label="{{ __('Title') }}" />
<x-form-textarea name="body" label="{{ __('Body') }}" />
<x-form-checkbox name="is_important" label="Important" />
<div class="flex items-center justify-end mt-4">
<x-form-submit class="ml-3">
{{ __('Post') }}
</x-form-submit>
</div>
</x-form>
チェックボックスを生やす

ただ、この場合、チェックボックスを空にして送信すると
General error: 1364 Field 'is_important' doesn't have a default value
とか言われちゃうから、バックエンドでnullの時は0を入れるようにするとか
<input type="hidden" name="is_important" value="0">
<x-form-checkbox name="is_important" label="Important" />
のように隠しフィールドを仕込んでおくとか、工夫が必要だ。隠しフィールドの方が楽っすかね、編集の事もあるし。
でまあその編集画面もコピペ対応。とりあえずここではベタで書いてくことにしよう
<x-guest-layout>
@bind($post)
<x-form action="{{ route('posts.update', $post) }}" method="put" class="mb-3">
<x-form-input name="title" label="{{ __('Title') }}" />
<input type="hidden" name="is_important" value="0">
<x-form-checkbox name="is_important" label="Important" />
<x-form-textarea name="body" label="{{ __('Body') }}" />
<div class="flex items-center justify-end mt-4">
<x-form-submit class="ml-3">
{{ __('Edit') }}
</x-form-submit>
</div>
</x-form>
@endbind
</x-guest-layout>

初期値がcheckedの時とか、チェックボックスの見た目を大幅に変更させる場合とかはまた結構めんどくさくて、基本、ブラウザのデフォルトの見た目になる。見た目の変更は別項でやりまひょ。この辺をちゃんとやろうとするとたかだかチェックボックス1つでもまあまあかかるって事ですナ
セレクトボックス
セレクトボックスのパターンの場合、大概リレーションになってる事が多いんじゃないだろーか。ここではPostCategoryというモデルを作成した。
% ./vendor/bin/sail artisan make:model PostCategory -ms
INFO Model [app/Models/PostCategory.php] created successfully.
INFO Migration [database/migrations/2023_08_29_104907_create_post_categories_table.php] created successfully.
INFO Seeder [database/seeders/PostCategorySeeder.php] created successfully.
ただまあ親テーブルを後から作るとテーブル作成の順番が面倒くさいので日付けを変更したりとかウンヌンカンヌン
ま、ともあれちゃっちゃと作る
public function up(): void
{
Schema::create('post_categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
seederでマスターデーターを投入
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class PostCategorySeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$categories = [
'news',
'blog',
'tutorial',
'review',
];
foreach ($categories as $name) {
\App\Models\PostCategory::create(['name' => $name]);
}
}
}
DatabaseSeederからコールして
<?php
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
// \App\Models\User::factory(10)->create();
// \App\Models\User::factory()->create([
// 'name' => 'Test User',
// 'email' => 'test@example.com',
// ]);
$this->call([
PostCategorySeeder::class,
]);
}
}
% ./vendor/bin/sail artisan migrate:fresh --seed
Dropping all tables ......................................................................................................... 70ms DONE
INFO Preparing database.
Creating migration table .................................................................................................... 28ms DONE
INFO Running migrations.
2014_10_12_000000_create_users_table ........................................................................................ 41ms DONE
2014_10_12_100000_create_password_reset_tokens_table ........................................................................ 57ms DONE
2019_08_19_000000_create_failed_jobs_table .................................................................................. 42ms DONE
2019_12_14_000001_create_personal_access_tokens_table ....................................................................... 60ms DONE
2023_08_28_204738_create_posts_table ........................................................................................ 22ms DONE
2023_08_29_104907_create_post_categories_table .............................................................................. 23ms DONE
INFO Seeding database.
Database\Seeders\PostCategorySeeder ........................................................................................... RUNNING
Database\Seeders\PostCategory
こんな感じでDBを作り直している。
<x-form action="{{ route('posts.store') }}" class="mb-3">
<x-form-input name="title" label="{{ __('Title') }}" />
<x-form-textarea name="body" label="{{ __('Body') }}" />
<x-form-select name="post_category_id" :options="$postCategories" label="Categories" />
<x-form-checkbox name="is_important" label="Important" />
<div class="flex items-center justify-end mt-4">
<x-form-submit class="ml-3">
{{ __('Post') }}
</x-form-submit>
</div>
</x-form>

とまあこんな感じになる。まだまだ続きますよ〜