插入和更新数据,同时保留旧数据?通过 Laravel
Inserting and updating data, also keeping the old datas at the same time? By Laravel
如果有none我正在插入数据(这部分没有问题)。但是如果有相同的数据。我也想更新它,如果数据更新了。然后我希望它保留旧数据。因为我会用到那些。
插入零件后遇到一些问题。更新数据并保留旧数据。
这是我的插入和更新代码;
$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))
这也是我的数据库:
主要 table: https://imgur.com/a/qIsgXsz
更新后的table:https://imgur.com/a/Ae90VWR
如果我对你的问题的理解正确,你需要在有 none 的情况下插入数据,如果存在则更新,但你还想保存更新前的数据,对吗?
您首先需要的是一个唯一标识符(一个用于检查条目是否存在的参数),在您的情况下,我想它是公司名称或 ID 或其他东西。
您还需要另一个 table,例如 "updated_entries",列为:ID | UPDATED_ENTRY_ID |价格 | (可能是日期);您将在其中保存所有旧数据。
当你检查是否需要插入或更新时,如果它是先更新你select你要更新的数据并将其插入到上面提到的"updated_entries",并通过条目的 ID 为 UPDATED_ENTRY_ID,因此每当您想查看某个条目的更新历史记录时,您只需 select 它 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.');
}
- 编辑代码以仅保存价格;
- 因此您不需要在第二个 table("updatedestates") 中包含任何其他参数,它只需要:ID、UPDATED_ENTRY_ID、PRICE;
在此之后,您可以轻松更新 table 并确保保存该条目的每个旧实例。
如果有none我正在插入数据(这部分没有问题)。但是如果有相同的数据。我也想更新它,如果数据更新了。然后我希望它保留旧数据。因为我会用到那些。
插入零件后遇到一些问题。更新数据并保留旧数据。
这是我的插入和更新代码;
$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))
这也是我的数据库: 主要 table: https://imgur.com/a/qIsgXsz
更新后的table:https://imgur.com/a/Ae90VWR
如果我对你的问题的理解正确,你需要在有 none 的情况下插入数据,如果存在则更新,但你还想保存更新前的数据,对吗?
您首先需要的是一个唯一标识符(一个用于检查条目是否存在的参数),在您的情况下,我想它是公司名称或 ID 或其他东西。
您还需要另一个 table,例如 "updated_entries",列为:ID | UPDATED_ENTRY_ID |价格 | (可能是日期);您将在其中保存所有旧数据。
当你检查是否需要插入或更新时,如果它是先更新你select你要更新的数据并将其插入到上面提到的"updated_entries",并通过条目的 ID 为 UPDATED_ENTRY_ID,因此每当您想查看某个条目的更新历史记录时,您只需 select 它 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.');
}
- 编辑代码以仅保存价格;
- 因此您不需要在第二个 table("updatedestates") 中包含任何其他参数,它只需要:ID、UPDATED_ENTRY_ID、PRICE;
在此之后,您可以轻松更新 table 并确保保存该条目的每个旧实例。