如果没有数据,我正在插入数据(此部分没有问题)。但是,如果有相同的数据。我也想更新它,如果数据更新了。然后,我希望它保留旧数据。因为我会用那些。
插入零件后遇到一些麻烦。更新数据并保留旧数据。
这是我的插入和更新代码;
$oldData= allestates::where('link',json_encode($outlineUrl))->addSelect('id' , 'price')->limit(1)->get()->toArray();
if(!empty($oldData)) {
$oldData = (array)$oldData[0];
$oldData['updated_estate_id'] = $oldData['id'];
unset($oldData['id']);
\DB::table('updated_estates')->insertGetId($oldData);
allestates::where('link',json_encode($outlineUrl))->update(['price' => $changeForMyDB['price'] ]);
}else{
allestates::insertGetId($changeForMyDB);
$this->line('Data saved.');
}
我现在遇到此错误:
SQLSTATE[HY000]: General error: 1364 Field 'link' doesn't have a default value (SQL: insert into updated_estates (price, updated_estate_id) values (1648万円(1戸)~3298万円(1戸), 1))
这也是我的数据库: 主表:https://imgur.com/a/qIsgXsz
更新后的表格:https://imgur.com/a/Ae90VWR
答案 0 :(得分:2)
如果我正确理解您的问题,则需要插入数据(如果没有)并进行更新(如果存在),但是您还想保存更新之前的数据,对吗?
您需要的第一件事是唯一标识符(用于检查条目是否存在的参数),在您的情况下,我想它是公司名称,ID或其他名称。
您还需要另一个具有列的表,例如“ updated_entries”:ID | UPDATED_ENTRY_ID |价格| (MAYBE DATE);您将在其中保留所有旧数据。
在检查是否需要插入或更新时,如果首先要更新,则选择要更新的数据,然后将其插入上述的“ updated_entries”中,并将条目的ID作为UPDATED_ENTRY_ID传递,因此无论何时您想要查看某个条目的更新历史,只需通过UPDATED_ENTRY_ID选择它即可。
您可以像这样进行上述操作:
$oldData= Estates::where('link',json_encode($outlineUrl))->addSelect('id' , 'price')->limit(1)->get()->toArray();
//so now old data only contains ID and PRICE
if(!empty($oldData)) { // If an entry exists you need to update it;
$oldData = (array)$oldData[0]; // You can't converts ->first() to an array so this is the only way I found;
$oldData['updated_entry_id'] = $oldData['id']; // You save id of the entry you are going to update;
unset($oldData['id']); // You don't need to insert this entry in saving table by it's old ID, you already stored it in 'updated_entry_id';
\DB::table('updated_entries')->insertGetId($oldData); // You save your old data and now you can proceed to updating;
//And if you only need to update price just do it like this:
Estates::where('link',json_encode($outlineUrl))->update(['price' => $changeForMyDB['price'] ]);
//Or you can update the whole row like this:
//Estates::where('link',json_encode($outlineUrl))->update($changeForMyDB);
}else{ // If you don't have any entries you just insert a new one;
Estates::insertGetId($changeForMyDB);
$this->line('Data saved.');
}
此后,您可以轻松地更新表并确保已保存该条目的每个旧实例。