【问题标题】:Laravel - Disable Updated At when updatingLaravel - 更新时禁用更新时间
【发布时间】:2015-05-19 07:59:09
【问题描述】:

在 laravel 5 上使用查询生成器进行更新时遇到问题。我尝试禁用 updated_at 但一直失败。

这是我的代码:

    $query = StockLog::where('stock_id', $id)->whereBetween('created_at', $from, $to])->update(['batch_id' => $max + 1]);

我尝试了两种方法: 我设置的第一个模型:

public function setUpdatedAtAttribute($value)
{
    /*do nothing*/
}

第二个:

$stocklog = new StockLog;
$stocklog->timestamps = false;

$query = $stocklog::where('stock_id', $id)->whereBetween('created_at', [$from, $to])->update([
        'batch_id' => $max + 1]);

他们都失败了。无论如何禁用updated_at?

提前致谢

【问题讨论】:

  • 永久关闭它?还是只针对一个特定的查询?
  • 嗨。永久关闭。 @TheShiftExchange
  • 当你说“他们两个都失败了”——实际的失败/错误是什么?
  • 找不到列:1054 '字段列表'@TheShiftExchange 中的未知列'updated_at'
  • 如果您根本不想拥有它,那么最好不要在迁移中拥有它。如果您正在使用迁移,您可能会有类似 $table->timestamps(); 的内容,您可以在模型中设置此 public $timestamps = false; 并手动添加 created_at

标签: php laravel laravel-4 laravel-5


【解决方案1】:

在这种情况下,最好使用 Query Builder 而不是 Eloquent,因为 查询生成器 不会隐式编辑时间戳字段。使用 Query Builder 的优点是只针对相关的更新操作而不改变所有模型。

你可以在一行中做到:

$query = \DB::table('stocklogs')->where('stock_id', $id)->whereBetween('created_at', [$from, $to])->update(['batch_id' => $max + 1]);

【讨论】:

    【解决方案2】:

    默认情况下,Eloquent 会自动维护数据库表中的 created_at 和 updated_at 列。只需将这些时间戳列添加到您的表中,Eloquent 就会处理剩下的事情。

    我真的不建议删除它们。但是如果你想使用下面的方式。

    将以下内容添加到您的模型:

    public $timestamps = false;
    

    这将禁用时间戳。

    编辑:看起来您想保留created_at 字段,您可以覆盖模型中的getUpdatedAtColumn。

    使用以下代码:

    public function getUpdatedAtColumn() {
        return null;
    }
    

    【讨论】:

    • 我需要创建 at 用于其他查询。
    • 哎哟!!成功了~。非常感谢。
    【解决方案3】:

    在你的模型中,添加这个方法:

    /**
     * @param  mixed  $value
     * @return $this
     */
    public function setUpdatedAt($value)
    {
        return $this;
    }
    

    更新:在 Laravel 5.5 中:

    尝试在你的模型中使用它:

    const CREATED_AT = null;
    const UPDATED_AT = null;
    

    【讨论】:

      【解决方案4】:

      如果你想永久关闭,可以使用以下功能。

      将以下内容添加到您的模型中...

      public $timestamps = false;
      

      如果您想继续使用 created_at,请添加以下内容。

          static::creating( function ($model) {
              $model->setCreatedAt($model->freshTimestamp());
          });
      

      或使用以下方式...

      /**
       * Set the value of the "updated at" attribute.
       *
       * @param  mixed  $value
       * @return void
       */
      public function setUpdatedAt($value)
      {
          $this->{static::UPDATED_AT} = $value;
      }
      

      【讨论】:

      • 我试过第一个和第二个。首先它给了我很多红色的语法。特别是在 static::creating 第二个不起作用。它仍然尝试更新'updated_at'
      • 检查这个laravel.com/docs/5.0/eloquent#timestamps 有办法阻止时间戳。
      【解决方案5】:

      接受的答案对我不起作用,但引导我朝着正确的方向找到这个解决方案:

      class Whatever extends Model {
          //...
          const UPDATED_AT=NULL;
          //...
      

      Laravel 5.3

      【讨论】:

      • 我相信这是这个问题的最佳答案。来源:if (! is_null(static::UPDATED_AT) && ...) { $this->setUpdatedAt($time); }
      • @andonovn 谢谢!并感谢您提供支持它的来源
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多