gpt4 book ai didi

Laravel 5.1 创建或更新重复

转载 作者:行者123 更新时间:2023-12-03 10:32:26 27 4
gpt4 key购买 nike

在 Laravel 5.1 中,对于 MySQL 插入,我想查看记录是否已经存在并在重复时更新或如果不存在则创建新记录。

我已经搜索过旧 laravel 版本的答案。在一个旧主题中,它说一个新的updateOrCreate()方法是去年在核心中添加的。但是当我尝试这样做时,我收到了错误:

Integrity constraint violation: 1062 Duplicate entry '1' for key 'app_id' 

这是我使用的查询:
AppInfo::updateOrCreate(array(
'app_id' => $postData['appId'],
'contact_email' => $postData['contactEmail']
));

在哪里 app_id是该表中的唯一外键,我想更新记录(如果存在)或创建一个新记录。我尝试搜索 5.1 文档,但找不到我需要的信息。有人可以在这里指导我吗...

最佳答案

将以下方法 insertUpdate 添加到您的模型

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;

/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name', 'email', 'password'];

/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token'];


public static function insertUpdate(array $attributes = [])
{
$model = new static($attributes);

$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;
}
}

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

它将执行的下一个查询:
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'

如果您已启用或禁用,该方法会自动添加/删除 Eloquent 时间戳。

关于Laravel 5.1 创建或更新重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31624473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com