【问题标题】:How to check if data is already in database using PHP?如何使用PHP检查数据是否已经在数据库中?
【发布时间】:2015-04-06 21:14:51
【问题描述】:

情况:

  • 我的 PHP 脚本将运行一次。
  • 这会将数据存储在我的数据库中。
  • 因为 1 周对我来说已经足够了,所以我只想保留它。
  • 假设今天是星期五还是 5(在我的情况下)。
  • 有没有办法检查数据库中的date == 5 是否为already exist,并可能用那个覆盖它?

  • 如果今天是星期五/5,那么所有带有 date == 5 的旧数据都应该覆盖并存储新数据。

  • 实际上,我只想存储一整周的数据。
  • 明天,下一个将重复同样的逻辑。

这是我将数据插入数据库的方法:

$data              = new Data;
$data->name        = $name;
$data->description = $description;
$data->dayOfWeek   = $today; // could be 0,1,2,3,4,5,6
$data->save(); 

我不确定,我如何在 Laravel 中实现这一点。 任何提示/建议将不胜感激!

【问题讨论】:

    标签: php mysql database laravel laravel-4


    【解决方案1】:

    您可以使用INSERT ... ON DUPLICATE KEY UPDATE,例如。像这样

    INSERT INTO `data` (`name`, `description`, `day`) VALUES (:name, :description, :day)
    ON DUPLICATE KEY UPDATE name = VALUES(name), description = VALUES(description)
    

    当然,您必须在 day 字段上声明唯一键才能使其工作。

    【讨论】:

    • 谢谢,这至少能让我朝着正确的方向思考。你知道如何在 Laravel 中做到这一点吗?我通常 - 只需 $data->save(); Laravel 会为我保存它。
    【解决方案2】:

    首先从数据库中获取数据;

    $data = Data::where('dayOfWeek', $today)->first();
    

    然后检查数据是否存在,如果没有创建则更新。

    if (!is_null($data)){
        $data->update($new_attribute_data)
    }
    else {
        Data::create($new_attribute_data);
    }
    

    注意:如果您将 GET 或 POST 数据放入其中,则使用 update 方法可能需要您在模型中填充 $fillable 数组。你可以这样做;

    class Data extends Eloquent {
        ...
        protected $fillable = ['name','description','dayOfWeek'];
    }
    

    Laravel 会用 Input 中的对应数据填充 Model Attribute。

    编辑:

    作为上述方法的一种更快的方法,使用updateOrCreate方法;

    Data::updateOrCreate(['dayOfWeek' => $today], $new_attribute_data);
    

    这将搜索具有与第一个参数匹配的属性的数据模型,并将使用第二个参数更新其其他属性。 Ref

    【讨论】:

      【解决方案3】:

      如果您指定 ON DUPLICATE KEY UPDATE,并且插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中的重复值,则会执行旧行的 UPDATE。例如,如果列 a 被声明为 UNIQUE 并且包含值 1,则以下两个语句具有相同的效果:

      示例代码:

      INSERT INTO table (a,b,c) VALUES (4,5,6)
        ON DUPLICATE KEY UPDATE c=9;
      

      【讨论】:

        【解决方案4】:

        为什么不在 foreach 循环之外执行此操作 - 在插入之前

        数据::where("dayOfWeek","=", $today)->delete();

        这应该照顾你想要的,然后你可以像往常一样继续插入:

        $data              = new Data;
        $data->name        = $name;
        $data->description = $description;
        $data->dayOfWeek   = $today; // could be 0,1,2,3,4,5,6
        $data->save(); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多