如何在唯一列的2条记录之间交换值

时间:2019-02-04 06:55:46

标签: mysql laravel

如何交换两个记录的“唯一”列中的值?

像下面的模型一样

User
  id
  name
  code // this is unique

我想做的就像...

$user1 = User::find(1);
$user2 = User::find(2);

DB::Transaction();
try {
    $user1->code = $user2->code;
    $user2->code = $user1->code;
    $user1->save();
    $user2->save();
} catch()...

当然,我知道此代码因约束违规错误而无法正常工作。

无论如何,我想交换UserA的代码和UserB的代码。 但是我不知道最好的方法。

有人知道吗?

我尝试了这段代码,它奏效了,但看起来有点脏。

$user1 = User::find(1);
$user2 = User::find(2);

DB::Transaction();
try {
        $user1_code_temp = $user1->code;
        $user2_code_temp = $user2->code;
    $user1->code = rand();
        $user1->save();
    $user2->code = $user1_code_temp;
    $user2->save();
        $user1->code = $user2_code_temp
    $user1->save();
} catch()...

2 个答案:

答案 0 :(得分:1)

您在做什么是正确的。我个人更喜欢这种方式,因为它对您的工作更具可读性。您可以暂时禁用mysql中的唯一检查,但我不建议这样做。

要清理代码,可以将其添加为用户模型中的方法:

<?php 

// Inside User.php model
/**
 * Exchange user code
 *
 * @param  User $user
 * 
 * @return void
 */
public function exchangeCode(User $user){

    $code1 = $this->code;
    $code2 = $user->code;

    $this->setCode(rand(6));

    $user->setCode($code1);

    $this->setCode($code2);

    return $this;

}

/**
 * Set Code
 * 
 * @param string $code
 *
 * @return  void
 */
public function setCode($code)
{
    $this->code = $code;
    $this->save();
    return $this;
}

// And then in controller

$user1->exchangeCode($user2);

答案 1 :(得分:-1)

在模型上定义

var list = [{"label": "test1","value": 1},{"label": "test2","value": 2}];

var temp = [];

list.forEach(l => {
  temp.push({
    "value": l.value,
    "label": l.label
  })
})

var fromlist = [...temp]; // create own unique "copy" of temp (not shared)
var tolist = [...temp]; // create own unique "copy" of temp (not shared)

fromlist.unshift({
  value: null,
  label: "select from"
});

tolist.unshift({
  value: null,
  label: "select to"
});

console.log(fromlist, 'From');
console.log(tolist, 'To');