【问题标题】:How can I force a timestamp update in Laravel 5.1 when performing a raw INSERT ... ON DUPLICATE KEY UPDATE?在执行原始 INSERT ... ON DUPLICATE KEY UPDATE 时,如何在 Laravel 5.1 中强制更新时间戳?
【发布时间】:2016-04-22 21:59:57
【问题描述】:

我使用 DB::statement($query, $params) 通过 INSERT ... ON DUPLICATE KEY UPDATE 语法对我的数据库执行批量插入。但是,当我这样做时,“updated_at”或“created_at”字段都不会更新。我想知道是否有办法强制在原始查询中更新正确的字段?

上下文:我正在使用 Laravel 5.1,并使用 $table->timestamps() 功能创建了相关表。除了进行原始插入/更新之外,我还使用 Eloquent 查询这些表,因此我无法实现禁用 Eloquent 自动更新的解决方案。

问题:目前我不清楚 Eloquent 自动更新时间戳字段时如何生成时间 - 我假设它会参考数据库的参考时钟触发数据库中的自动更新?我想模仿但 Eloquent 正在这样做,这样我就不会使用两个不同的时钟作为源来结束时间。

我对使用原始 MySQL 查询非常陌生,因此提前感谢人们能够提供的任何建议/见解!谢谢!

【问题讨论】:

    标签: php mysql laravel-5 timestamp


    【解决方案1】:
    <?php
    
    // use insertGetId method
    
        $id = DB::table('users')->insertGetId([]);
    
    // and now update your table using where method
    
        DB::table('users')->update([
                                 'created_at' => date('Y-m-d H:i:s'),
                                 'updated_at' => date('Y-m-d H:i:s')
                           ])->where('id',$id);
    

    【讨论】:

    • 感谢您的回复,但我认为它不会达到我所追求的效果。我相信 insertGetId() 方法 - 就像 insert() 方法一样 - 不允许查询的“重复键更新”部分 - 这就是我不得不使用原始查询的原因。另外,我想更新 created_at 或 updated_at 字段,具体取决于原始查询最终是执行插入还是更新,而不是两个字段。我希望可能有原始的 MySQL 查询语法可以触发相应的时间戳列进行更新。
    【解决方案2】:

    目前我不清楚 Eloquent 是如何生成时间的 自动更新时间戳字段 - 我假设它触发 参考数据库的引用在数据库中自动更新 时钟?

    没有。 Laravel 使用的是 Carbon 类,内部使用的是 PHPs DateTime 类。您可以在source code of the save() method 中看到这一点。追踪:save() -&gt; performInsert() -&gt; updateTimestamps() -&gt; freshTimestamp() -&gt; new Carbon

    我想模仿但 Eloquent 正在这样做,所以我 不要以使用两个不同的时钟作为源来结束时间。

    您可以创建与 Eloquent 相同的时间戳:

    $currentTimestamp = Carbon\Carbon::now()->toDateTimeString();
    

    或者如果您有任何Model 实例:

    $currentTimestamp = $model->freshTimestampString();
    

    【讨论】:

    • 感谢您对 save() 引擎盖下发生的事情的澄清(和链接)。我最终使用 Carbon 创建时间戳并将其添加到我的原始查询中。
    【解决方案3】:

    你可以用 Eloquent 做到这一点
    我想你已经有你的身份证了

    <?php
    // $id your id
    $object = Model::find($id);
    
    // If is null you make insert row on your DB
    if(null===$object) Model::create($inputs);
    
    // If not null you make update row on your DB
    else $object->fill($inputs)->save();
    

    如果你喜欢这个 eloquent 管理 created_at 和 updated_at

    【讨论】:

    • '害怕我不能在这个上使用 Eloquent,因为我试图在一次调用数据库中创建或更新多个模型,而不是单独循环遍历每个模型。据我所知,没有 Eloquent 方法可以访问 MySQL 查询的功能(INSERT... ON DUPLICATE UPDATE),允许创建 - 或者,如果模型已经存在,更新 -单个数据库调用的大量模型。感谢您对这个问题提出质疑!
    【解决方案4】:

    在使用原始数据库查询时,我始终无法找到自动触发时间戳插入/更新的方法,因此我最终将它们硬编码到我的查询中。

    我根据需要将created_at 列添加到我的原始INSERT ... ON DUPLICATE KEY UPDATE 列列表中。然后,我实现了一种自动生成更新列值对的方法,该对在updated_at 中交换,而不是created_at 作为给定时间值的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 2015-02-17
      • 2017-04-24
      相关资源
      最近更新 更多