Вставка и обновление данных, в то же время сохраняя старые данные одновременно?Ларавел - PullRequest
0 голосов
/ 12 октября 2018

Я вставляю данные, если их нет (проблем с этой частью нет).Но если есть такие же данные.Я также хочу обновить это, и если данные обновляются.Тогда я хочу сохранить старые данные.Потому что я буду использовать их.

Возникли проблемы после установки детали.Обновление данных и сохранение старых.

Вот моя вставка и обновление кодов;

$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 голосов
/ 12 октября 2018

Если я правильно понимаю ваш вопрос, вам нужно вставить данные, если их нет, и обновить, если они существуют, но вы также хотите сохранить данные, которые у вас были до обновления, верно?

Первое, что вам нужно, это уникальный идентификатор (параметр, по которому вы проверяете, существует запись или нет), в вашем случае я предполагаю, что это название компании или ID или что-то в этом роде.

Вытакже нужна другая таблица, например «updated_entries», со столбцами: ID |UPDATED_ENTRY_ID |ЦЕНА |(МОЖЕТ ДАТА);где вы будете хранить все старые данные.

Когда вы проверяете, нужно ли вставлять или обновлять, если это обновление сначала, вы выбираете данные, которые вы собираетесь обновить, и вставляете их в вышеупомянутые "updated_entries"", и передайте идентификатор записи как 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;

После этого вы можете легко обновить свою таблицу и быть уверенным, что каждый старый экземпляр этой записи сохранен.

...