插入和更新数据,还同时保留旧数据?由Laravel

时间:2018-10-12 06:02:58

标签: php mysql laravel domparser

如果没有数据,我正在插入数据(此部分没有问题)。但是,如果有相同的数据。我也想更新它,如果数据更新了。然后,我希望它保留旧数据。因为我会用那些。

插入零件后遇到一些麻烦。更新数据并保留旧数据。

这是我的插入和更新代码;

$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

1 个答案:

答案 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.');

}
  • 修改后的代码只能节省价格;
  • 因此,您不需要在第二个表中具有任何其他参数(“ updatedestates”),它只需要:ID,UPDATED_ENTRY_ID,PRICE;

此后,您可以轻松地更新表并确保已保存该条目的每个旧实例。