どんな記事? 何度かLarav…
Laravel12での各種設定等・便利機能メモ
データベースにレポートを保存する形式のアプリを作る。
モデルの生成
php artisan make:model Report -m
-mを入れることで、モデルファイル作成時に、マイグレートファイルも同時に作成
マイグレーションファイルは作るが
public function up(): void
    {
        Schema::create('reports', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('business_id');
            $table->unsignedBigInteger('user_id');
            $table->timestamp('report_date')->nullable();
            $table->unsignedBigInteger('shift_id');
            $table->unsignedBigInteger('situation_id');
            $table->timestamp('arrival_time')->nullable();
            $table->timestamps();
        });
    }
->nullable()でNULLを可能にする。 Laravelの timestamp() カラムは、NULLを許可しない場合が多いです。
モデル、1対多のリレーション
ModelをUserと結びつけるには新しく作ったモデル内で
belongsTo(User::class);
    }
}
とする。 さらに、User.php側も
<?php
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Str;
class User extends Authenticatable
{
    /** @use HasFactory */
    use HasFactory, Notifiable;
    /**
     * The attributes that are mass assignable.
     *
     * @var list
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
    /**
     * The attributes that should be hidden for serialization.
     *
     * @var list
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];
    /**
     * Get the attributes that should be cast.
     *
     * @return array
     */
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }
    /**
     * Get the user's initials
     */
    public function initials(): string
    {
        return Str::of($this->name)
            ->explode(' ')
            ->map(fn (string $name) => Str::of($name)->substr(0, 1))
            ->implode('');
    }
    public function reports() {
        return $this->hasMany(Report::class);
    }
}
とする。リレーションを作成したら、その情報をデータベース上のテーブルにも反映。
$table->foreignId('user_id');
などと直して
php artisan migrate:rollback php artisan migrate
これでOK。
Viewファイルで新規画面制作
ビューファイルの作成→コントローラー→ルート設定の順番に作る。
viewファイルを作る
resources/viewsの中にディレクトリ「report」を作る。 その中に「create.blade.php」を作る。
リソースコントローラーの設定
php artisan make:controller コントローラー名 --resource
今回は「report」のものを作るので
php artisan make:controller ReportController --resource --model=Report
になる。すると \app\Http\Controllers\ReportController.php ができる。
–model=Reportを付けたので use App\Models\Report;が追記されている。
画面表示部分
ReportController.phpのcreate部分に
public function create()
    {
        return view('report.create');
    }
を追記。 さっき作った resources/views/report/create.blade.php を使うよと設定。 report.createの前半はディレクトリ、後半はファイル名。
web.phpのルート設定
次はルート設定。 routes/web.phpに書き込む。 今回リソースコントローラーなので 上の方で
use App\Http\Controllers\ReportController;
ReportControllerを使うよと宣言して
Route::middleware(['auth'])->group(function () {
//最初から入っているものは省略
    Route::resource('report', ReportController::class);
}
と入れる。 これで
Route::get('report', [ReportController::class, 'index'])->name('report.index');
Route::get('report/create', [ReportController::class, 'create'])->name('report.create');
Route::post('report', [ReportController::class, 'store'])->name('report.store');
Route::get('report/{report}', [ReportController::class, 'show'])->name('report.show');
Route::get('report/{report}/edit', [ReportController::class, 'edit'])->name('report.edit');
Route::patch('report/{report}', [ReportController::class, 'update'])->name('report.update');
Route::delete('report/{report}', [ReportController::class, 'destroy'])->name('report.destroy');
と同じ意味になる。 {report}の部分は各投稿のidが数字で入る。
ここまでできたら/report/createで表示できるはず。 投稿するものなので投稿を保存するフェーズへ。
データベースにレポートを保存
コントローラーとビューファイルとデータベース全て揃ったら、処理を実行できる。
フォームを作る。
こんな感じ。
{{old('title’)}}みたいにするのは 二重波カッコ{{}}で囲むだけで、エスケープ処理ができる。というか必須で。 oldは入力してエラーになっても前回入力していた内容が残る。 なので全部この形式でいい。
ルートはすでに今回リソースコントローラーなので決まってる。 今回のやり方で作ったものは全部これになる。
indexメソッド /report (URL) report.index(ルート名) createメソッド /report/create (URL) report.create(ルート名)(HTTPメソッド:GET) storeメソッド /report (URL) report.store(ルート名)(HTTPメソッド:POST) showメソッド /report/{report} (URL) report.show(ルート名)(HTTPメソッド:GET) editメソッド /report/{report}/edit (URL) report.edit(ルート名)(HTTPメソッド:GET) updateメソッド /report/{report} (URL) report.update(ルート名)(HTTPメソッド:PUT/PATCH) destroyメソッド /report/{report} (URL) report.destroy(ルート名)(HTTPメソッド:DELETE)
なので、 データを保存する用のstoreメソッドを実行するために モデルに処理を書く。
モデルに処理を書く
まずは入力したものを送信する許可を与える。 protected $fillableで入力された項目を送信することを許可。
app/models/Report.php
protected $fillable = [
        'situation_id',
        'arrival_time_day',
        'arrival_time_minutes',
    ];
みたいな。
コントローラーに処理を書く
次はコントローラーに処理を書く。ついでにバリデーションも。
App/Http/Controllers/ReportController.php
※順次追記します







ディスカッション
コメント一覧
まだ、コメントがありません