環境準備

### はじめに
環境準備であるが、DB操作の元になる箇所を重点に記載する。

### 前準備
・プロジェクト作成
(例)
composer create-project laravel/laravel laravel_test

・データベース作成

・.env修正
(例）
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=root

### テーブル定義
テーブル名: project_works

カラム名:
employee_id            : 社員ID
project_code           : プロジェクトコード
work_date              : 作業日
budget_actual_flag     : 予定0,実績1
work_hours             : 工数時間

### テーブル作成
php artisan make:migration create_project_works_table --create=project_works

作成されたマイグレーションファイル(database/migrations直下に作成される)
```php
    public function up(): void
    {
        Schema::create('project_works', function (Blueprint $table) {
            $table->id();
            $table->string('employee_id');
            $table->string('project_code');
            $table->date('work_date');
            $table->tinyInteger('budget_actual_flag');
            $table->decimal('work_hours', 5, 2);
            $table->timestamps();
        });
    }
```

```
php artisan migrate
```

### データ作成

```
php artisan make:seeder ProjectWorksTableSeeder
```

database/seeders/ProjectWorksTableSeeder.phpが作成される。
データは、employee_idに対し複数のproject＿codeがある場合、
各社員IDが1つのプロジェクトから5つのプロジェクトを割り当てる。
１日にできる労働時間は12時間まで、作業日数は複数日となるように
一人の社員が1日に扱うプロジェクト全体の労働時間の合計が12時間以内。
こんなの一人で作れない。

```php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class ProjectWorksTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $startMonth = 6;  // Starting month
        $endMonth = 12;  // Ending month

        $data = [];

        for ($m = $startMonth; $m <= $endMonth; $m++) {
            // Additional data
            for ($i = 1; $i <= 22; $i++) {
                $empId = 'EMP' . str_pad($i, 3, '0', STR_PAD_LEFT);
                $numProjects = rand(1, 5);  // Generate random number of projects between 1 and 5

                for ($j = 1; $j <= $numProjects; $j++) {
                    $projectCode = 'PRJ' . str_pad($j, 3, '0', STR_PAD_LEFT);
                    $numDays = rand(1, 5);  // Generate random number of days between 1 and 5

                    for ($k = 0; $k < $numDays; $k++) {
                        $workDay = date('Y-m-d', strtotime("2023-{$m}-" . str_pad($i + $k, 2, '0', STR_PAD_LEFT)));
                        $workHours = 0;

                        // Calculate the total work hours already allocated to the employee on this day
                        $totalWorkHours = 0;
                        foreach ($data as $row) {
                            if ($row['employee_id'] == $empId && $row['work_date'] == $workDay) {
                                $totalWorkHours += $row['work_hours'];
                            }
                        }

                        $remainingHours = 12 - $totalWorkHours;  // Remaining hours the employee can work on this day

                        if ($remainingHours <= 0) continue;

                        if ($j != $numProjects) {
                            // If it's not the last project for the day, assign random hours, ensuring at least 1 hour remains for the last project
                            $workHours = rand(1, min($remainingHours, $remainingHours - ($numProjects - $j)));
                        } else {
                            // If it's the last project for the day, assign the remaining hours
                            $workHours = $remainingHours;
                        }

                        $data[] = [
                            'employee_id' => $empId,
                            'project_code' => $projectCode,
                            'work_date' => $workDay,
                            'work_hours' => $workHours,
                            'budget_actual_flag' => rand(0, 1)
                        ];
                    }
                }
            }
        }

        DB::table('project_works')->insert($data);
    }
}


```

シーダー実行
```
php artisan db:seed --class=ProjectWorksTableSeeder
```

やり直す場合はリセットしてから実行
```
php artisan migrate:fresh
php artisan db:seed --class=ProjectWorksTableSeeder
```