Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更新表列并将旧数据推入另一列_Php_Mysql_Database_Laravel_Web Scraping - Fatal编程技术网

Php 更新表列并将旧数据推入另一列

Php 更新表列并将旧数据推入另一列,php,mysql,database,laravel,web-scraping,Php,Mysql,Database,Laravel,Web Scraping,我在更新数据和将旧数据保留在另一列时遇到了一些麻烦。我在表中有一个“price”列,对于旧数据,我创建了一个“old_price”列。因此,我正在网上抓取一个网站,如果该网站上的价格发生变化,我想更新我的表的价格列。但棘手的是,我还需要将旧价格推到“old_price”列 所以在我的代码中,我首先检查是否有这些数据。因为我不想复制整个数据。如果我没有数据,就把这些数据插入我的数据库 <?php if (allestates::where('link', '=', json_encode($

我在更新数据和将旧数据保留在另一列时遇到了一些麻烦。我在表中有一个“price”列,对于旧数据,我创建了一个“old_price”列。因此,我正在网上抓取一个网站,如果该网站上的价格发生变化,我想更新我的表的价格列。但棘手的是,我还需要将旧价格推到“old_price”列

所以在我的代码中,我首先检查是否有这些数据。因为我不想复制整个数据。如果我没有数据,就把这些数据插入我的数据库

<?php
if (allestates::where('link', '=', json_encode($outlineUrl))->count() > 0) {
    $this->error('I have the DATA.');
} else {
    allestates::insertGetId($changeForMyDB);
    $this->line('DATA SAVED.');
}

您可以检查现有行上的更改,如下所示:

if ($allestate = allestates::where('link', '=', json_encode($outlineUrl))->first()) {
    if ($allestate->price != $changeForMyDB['price']) {
        $allestate->old_price = $allestate->price;
        $allestate->fill($changeForMyDB);
        $allestate->save(); 
    }
} else {
    allestates::insertGetId($changeForMyDB);
    $this->line('DATA SAVED.');
}
或者,当价格发生变化时,您可以使用观察者设置旧的价格列:

在你的国家观察员中:

public function updating($allestate) 
{
    if ($allestate->wasChanged(['price']) {
        $allestate->old_price = $allestate->getOriginal('price');
        $allestate->save();
    }
}

阅读有关在此处设置观察者的更多信息:

@wheelmaker更新两列,意味着不保留旧数据?我不明白你说的更新两列是什么意思?谢谢你的帮助,在插入数据之前,我应该把这个函数推到哪里?这将是在它自己的观察者类中,通过我在那里发布的文档链接阅读。另外,你提到(在删除的评论中)你不想“更新两列”,我认为这意味着您不想手动更新控制器中的旧价格。如果不是这样的话,你最好跳过observer类,只检查当前价格是否与新价格不同,然后在一个地方进行处理。我用一个例子更新了答案,说明在没有观察者的情况下处理所有价格。是的!这就是我想要的。我经常运行我的web scrape bot。如果价格发生变化。我可以勉强接受新价格,然后推旧价格,对吗。非常感谢。同时也感谢《观察家》。如果需要,请使用:)
public function updating($allestate) 
{
    if ($allestate->wasChanged(['price']) {
        $allestate->old_price = $allestate->getOriginal('price');
        $allestate->save();
    }
}