Laravel 5.1 Create or Update on Duplicate

前端 未结 6 948
悲哀的现实
悲哀的现实 2020-12-03 01:29

In Laravel 5.1, for MySQL insert, I want to see if the record already exists and update on duplicate or create new if none exists.

I have already searched SO where t

6条回答
  •  日久生厌
    2020-12-03 01:34

    Add the follow method insertUpdate to your Model

    fill($attributes);
    
            if ($model->usesTimestamps()) {
                $model->updateTimestamps();
            }
    
            $attributes = $model->getAttributes();
    
            $query = $model->newBaseQueryBuilder();
            $processor = $query->getProcessor();
            $grammar = $query->getGrammar();
    
            $table = $grammar->wrapTable($model->getTable());
            $keyName = $model->getKeyName();
            $columns = $grammar->columnize(array_keys($attributes));
            $insertValues = $grammar->parameterize($attributes);
    
            $updateValues = [];
    
            if ($model->primaryKey !== null) {
                $updateValues[] = "{$grammar->wrap($keyName)} = LAST_INSERT_ID({$keyName})";
            }
    
            foreach ($attributes as $k => $v) {
                $updateValues[] = sprintf("%s = '%s'", $grammar->wrap($k), $v);
            }
    
            $updateValues = join(',', $updateValues);
    
            $sql = "insert into {$table} ({$columns}) values ({$insertValues}) on duplicate key update {$updateValues}";
    
            $id = $processor->processInsertGetId($query, $sql, array_values($attributes));
    
            $model->setAttribute($keyName, $id);
    
            return $model;
        }
    }
    

    You can use:

    App\User::insertUpdate([
        'name' => 'Marco Pedraza',
        'email' => 'mpdrza@gmail.com'
    ]);
    

    The next query it will be executed:

    insert into `users` (`name`, `email`, `updated_at`, `created_at`) values (?, ?, ?, ?) on duplicate key update `id` = LAST_INSERT_ID(id),`name` = 'Marco Pedraza',`email` = 'mpdrza@gmail.com',`updated_at` = '2016-11-02 01:30:05',`created_at` = '2016-11-02 01:30:05'
    

    The method automatically add/remove the Eloquent timestamps if you have enabled or disabled.

提交回复
热议问题