插入和更新数据,同时保留旧数据?通过 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 并确保保存该条目的每个旧实例。