LaravelでDB操作をEloquentで行う

## はじめに
前回の[LaravelのDB操作](https://qiita.com/kenji123/items/f61cb1037b10c31de255)ではEloquentを使用せず行なった。
今回は社員マスタを追加し、リレーションを組むことにより簡易に取得可能な状態を目指す。

## 社員マスターテーブルの作成
### マイグレーションファイルを作成
```bash
php artisan make:migration create_employees_table --create=employees
```

### マイグレーションファイルを編集
employee_codeとリレーションを持たせるproject_worksのemployee_idを後で紐づける。
```php
public function up()
{
    Schema::create('employees', function (Blueprint $table) {
        $table->increments('id');
        $table->string('employee_code')->unique();
        $table->string('name');
        $table->timestamps();
    });
}
```

(現状のproject_work)
```php
        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
```

### 間違えた場合
1.マイグレーションのロールバック
```
php artisan migrate:rollback
```
2.マイグレーションファイルの編集

3.マイグレーションの実行
```
php artisan migrate
```

## Eloquentモデルを作成
社員マスターテーブルに対応するEloquentモデルを作成
```
php artisan make:model Employee
```
これにより、app/ModelsディレクトリにEmployee.phpというモデルクラスが生成される。

## リレーションの定義
EmployeeモデルとProjectWorkモデルの間にリレーションを定義する。
これにより、これら2つのモデル間でEloquentが提供する便利なメソッドを使用できるようになる。
一人の従業員が複数のプロジェクト作業を持つというhasManyリレーションを定義する。
今回の場合は、リレーションさせるカラムを特定する必要がある。

```Employee.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Employee extends Model
{
    // 追加
    public function projectWorks()
    {
        return $this->hasMany('App\Models\ProjectWork', 'employee_id', 'employee_code');
    }
}
```

```ProjectWork.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Employee extends Model
{
    public function employee()
    {
        return $this->belongsTo(Employee::class, 'employee_id', 'employee_code');
    }
}
```

## リレーションの作成と実行
Eloquentを使ってDB操作している。
ProjectWorkという単一モデルから、employeeメソッドを使用し、employeesのnameを取得している。
```php
use App\Models\ProjectWork;

$projectWorks = ProjectWork::with('employee')->get();

$processed = $projectWorks->map(function ($projectWork) {
    return [
        'employee_id' => $projectWork->employee_id,
        'project_code' => $projectWork->project_code,
        'name' => $projectWork->employee->name ?? 'No Employee',
        // 他の属性を必要に応じてここに追加...
    ];
});

dd($processed);


```

(結果例)
```php
Illuminate\Support\Collection {#1749 ▼ // app/Http/Controllers/ProjectWorkController.php:33
  #items: array:1448 [▶
    0 => array:3 [▶
      "employee_id" => "EMP001"
      "project_code" => "PRJ001"
      "name" => "EMP001 テスト"
    ]
    1 => array:3 [▶
      "employee_id" => "EMP001"
      "project_code" => "PRJ001"
      "name" => "EMP001 テスト"
    ]
    2 => array:3 [▶
      "employee_id" => "EMP001"
      "project_code" => "PRJ001"
      "name" => "EMP001 テスト"
    ]
        ・・・
    12 => array:3 [▶
      "employee_id" => "EMP001"
      "project_code" => "PRJ004"
      "name" => "EMP001 テスト"
    ]
    13 => array:3 [▶
      "employee_id" => "EMP001"
      "project_code" => "PRJ004"
      "name" => "EMP001 テスト"
    ]
    14 => array:3 [▶
      "employee_id" => "EMP002"
      "project_code" => "PRJ001"
      "name" => "No Employee"
    ]
    15 => array:3 [▶
      "employee_id" => "EMP002"
      "project_code" => "PRJ001"
      "name" => "No Employee"
    ]

```

## 終わりに
Eloquentをようやく使い始めたが、テーブル間の操作が簡易になるのを実感できた。
sqlでjoinしなくても、Eloquentの機能を使えば取得できる。
ただ、今回かろうじてリレーションを組めたが、さらなる理解が必要で、学習コストは高そうである。
sqlに慣れていたらDBファザードを使えばいいと思うが、データ操作が楽になるメリットは大きい。