インサート、アップデート、アップサートの実装方法、コピペ用でOK（Laravel）

## 始めに
Laravelのインサート、アップデート、アップサートは多用するので
コピペ用の記事＋備忘録として作成しました。

## 環境
| 開発環境    |バージョン |
|-----------|------------|
| __Laravel__ | 8.83.19 |
| __PHP__     | 7.3.10  |

## インサート（insert）
```PHP:InsertFunctionController.php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Exception;

/**
* インサート機能
* @params array インサートしたい情報
*/
public function insertFunction($params)
{
    // 初期設定
    $isError = false;

    // トランザクション開始
    DB::beginTransaction();
    try {
        // インサート情報
        $insertStr = [
            'column_1' => $params['column_1'],
            'column_2' => $params['column_2']
            // ... 略
        ];

        // テーブルA（tbl_A）にインサートする
        $sqlData = DB::table('tbl_A');
        $result = $sqlData->insert($insertStr);
        if ($result == false) {
            throw new Exception('インサート中にエラーが発生しました。');
        }

    } catch (Exception $e) {
        // ログ出力
        Log::error(get_class($this).':'.__FUNCTION__);
        Log::error($e->getMessage());
        $isError = true;
    
    } finally { 
        // エラーが存在する場合
        if ($isError == false) {
            // コミットする
            DB::commit();
        // エラーが存在しない場合
        } else {
            // ロールバックする
            DB::rollback();
        }
    }
}
```



## アップデート（update）
```PHP:UpdateFunctionController.php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Exception;

/**
* アップデート機能
* @params array アップデートしたい情報
*/
public function updateFunction($params)
{
    // 初期設定
    $isError = false;

    // トランザクション開始
    DB::beginTransaction();
    try {
        // アップデート情報
        $updateStr = [
            'column_1' => $params['column_1'],
            'column_2' => $params['column_2'],
            
            // ... 略

            'updated'  => date('Y-m-d H:i:s')
        ];

        // テーブルB（tbl_B）にアップデートする
        $sqlData = DB::table('tbl_B');
        $result = $sqlData->update($updateStr);
        if ($result < 0) {
            throw new Exception('アップデート中にエラーが発生しました。');
        }

    } catch (Exception $e) {
        // ログ出力
        Log::error(get_class($this).':'.__FUNCTION__);
        Log::error($e->getMessage());
        $isError = true;
    
    } finally {
        // エラーが存在する場合
        if ($isError == false) {
            // コミットする
            DB::commit();
        // エラーが存在しない場合
        } else {
            // ロールバックする
            DB::rollback();
        }
    }
}
```

## アップサート（upsert）
```PHP:UpsertFunctionController.php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Exception;

/**
* アップサート機能
* @params array アップサートしたい情報
*/
public function upsertFunction($params)
{

    Log::debug(__FUNCTION__);

    // トランザクション開始
    DB::beginTransaction();
    try {
        // 初期設定
        $isError       = false;

        // 検索情報
        $searchStr = [
            'column_a'  => $params['column_a'] // 検索したいカラム
        ];

        // アップサート情報
        $upsertStr = [
            'column_1' => $params['column_1'],
            'column_2' => $params['column_2'],
            // ... 略
        ];

        // テーブルC（tbl_C）にアップサートする
        // テーブル内に検索情報が存在しない場合 → インサート
        // テーブル内に検索情報が存在する場合　 → アップデート
        $sqlData = DB::table('tbl_C');
        $result = $sqlData->updateOrInsert($searchStr, $upsertStr);
        if ($result == false || $result < 0) {
            throw new Exception('アップサート中にエラーが発生しました。');
        }

    } catch (Exception $e) {
        // ログ出力
        Log::error(get_class($this).':'.__FUNCTION__);
        Log::error($e->getMessage());
        $isError = true;

    } finally {
        // エラーが存在する場合
        if ($isError == false) {
            // コミットする
            DB::commit();
        // エラーが存在しない場合
        } else {
            // ロールバックする
            DB::rollback();
        }
    }
}
```

## 最後に
以上、DB登録の実装方法でした。
__もっといい書き方ありありましたら、コメントいただけますとありがたいです。💦__
よろしくお願いします。