4

通常,Laravel 平台有一个$table->timestamps(); in migration...,它生成两个datetime字段,但我想实现我自己的时间戳,或者,也许调用unix_timestamps(). 我想要两个名为created_at, 和的字段updated_at,它们存储 unix 时间戳,我该如何实现它?谢谢。

4

5 回答 5

7

你不必使用 Laravel 的时间戳助手,但它们很方便。现在也有一些处理字符串时间戳的好方法,包括 PHP 的DateTime类。但我离题了,使用unix时间戳......

  1. 在您的架构(迁移)中,使用

    $table->integer('created_at');
    $table->integer('updated_at');
    

    代替

    $table->timestamps();
    
  2. 替换timestamp()模型中的函数。

  3. 保留$timestamps = true在您的模型中。

这是一个示例基本模型,您可以使用它并在您的模型上扩展而不是 Eloquent:

// models/basemodel.php
class BaseModel extends Eloquent {

    /**
     * Indicates if the model has update and creation timestamps.
     *
     * @var bool
     */
    public static $timestamps = true;

    /**
     * Set the update and creation timestamps on the model.
     */
    public function timestamp()
    {
        $this->updated_at = time();

        if ( ! $this->exists) $this->created_at = $this->updated_at;
    }
}

// models/thing.php
class Thing extends BaseModel {

}
于 2013-04-12T14:29:47.153 回答
4

对于 Laravel 4:

  • 覆盖 Eloquent 模型中的 freshTimestamp() 方法
  • 在迁移文件中使用整数而不是时间戳

模型/product.php

class Product extends Eloquent {
    protected $table = 'products';

    public function freshTimestamp()
    {
        return time();
    }
}

Laravel 4 还将所有日期/时间戳更改为 Carbon 实例(在此处记录)

这意味着您还需要覆盖该getDates()方法,以防止 Carbon 在插入之前破坏您的时间戳。

public function getDates()
{
    return array();
}

数据库/迁移/2013_04_20_125823_create_products_table.php

public function up()
{
    Schema::create('products', function(Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->integer('created_at');
        $table->integer('updated_at');
    });
}
于 2013-05-03T08:26:58.617 回答
3

我担心你需要一些丑陋的黑客来重写这个timestamps()函数,我敢肯定这是个坏主意。

如果您需要自己的格式,只需定义一个新列。Laravel 的模式构建器中甚至还有一个时间戳列(请参阅此处以获取可用格式的完整列表):

$table->timestamp('added_on');

但是,您需要定义默认值和/或ON UPDATE自己定义,或者您可以使用triggers。但最后你可能最好还是坚持使用 Laravel 的timestamps(),因为它会自动处理所有事情。为什么你还需要其他东西?

于 2013-04-05T12:38:04.877 回答
2

我有同样的要求,并想出了一个可能也适合你的解决方案。我在 Github 上发布了一个关于我是如何做到的回购:Laravel Integer SQL Dates <== 查看它以获取更多详细信息,但这里是它的要点:

class Base extends Eloquent {

  public function freshTimestamp()
  {
    return time(); // (int) instead of '2000-00-00 00:00:00'
  }

  public function fromDateTime($value)
  {
    return $value; // Don't mutate our (int) on INSERT!
  }

  // Uncomment, if you don't want Carbon API on SELECTs
  // protected function asDateTime($value)
  // {
  //   return $value;
  // }

  public function getDateFormat()
  {
    return 'U'; // PHP date() Seconds since the Unix Epoch
  }
}

class User extends Base {

  protected $table = 'users';

  protected $fillable = ['email'];
}
于 2014-05-18T23:12:54.643 回答
1

只需创建一个时间戳类型的迁移/模型字段,然后在您的控制器中,使用当前时间填充它

$myField = new \DateTime();
于 2017-04-12T11:44:13.470 回答