如何交换两个记录的“唯一”列中的值?
像下面的模型一样
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()...
答案 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');