0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-18

始めに

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

環境

開発環境 バージョン
Laravel 8.83.19
PHP 7.3.10

インサート(insert)

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)

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)

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登録の実装方法でした。
もっといい書き方ありありましたら、コメントいただけますとありがたいです。💦
よろしくお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?