如何在laravel中只使用created_at

ref*_*r99 49 php laravel

大家.

我是laravel的新手.

这是我的问题:

这可以自定义时间戳名称

const CREATED_AT = 'created';
const UPDATED_AT = 'updated';
Run Code Online (Sandbox Code Playgroud)

这可以禁用时间戳

public $timestamps = false;
Run Code Online (Sandbox Code Playgroud)

我只想使用created_at,怎么做?

Jos*_*ber 74

Eloquent不提供开箱即用的功能,但您可以使用creating事件回调自行创建:

class User extends Eloquent {

    public $timestamps = false;

    public static function boot()
    {
        parent::boot();

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

}
Run Code Online (Sandbox Code Playgroud)

  • 您也可以通过在迁移中执行`$ table-> timestamp('created_at') - > useCurrent();`来跳过引导代码 (7认同)
  • 可以改进这个以使用`$ model-> setCreatedAt($ model-> freshTimestamp());`这将使用`static :: CREATED_AT` const (3认同)

Rod*_*ira 47

使用在顶部:

const UPDATED_AT = null;
Run Code Online (Sandbox Code Playgroud)

对于'created_at'字段,您可以使用:

const CREATED_AT = null;
Run Code Online (Sandbox Code Playgroud)

LARAVEL 5.5.0 - 5.5.5更新

在Laravel 5.5.0中被打破(并在5.5.5中再次修复).

如果您使用的是5.5.x,请确保您使用的是最新版本.

如果由于某种原因你不能使用最新版本,这是一个解决方法.

将public $ timestamps设置为false:

public $timestamps = false;
Run Code Online (Sandbox Code Playgroud)

并在必要时:

public function setCreatedAtAttribute($value) { 
    $this->attributes['created_at'] = \Carbon\Carbon::now(); 
}
Run Code Online (Sandbox Code Playgroud)

要么

public function setUpdatedAtAttribute($value) { 
    $this->attributes['updated_at'] = \Carbon\Carbon::now(); 
}
Run Code Online (Sandbox Code Playgroud)

当需要两个字段"created_at"和"updated_at"时,您当然不需要做任何事情;)

  • 使用来源,孩子们.这种方法不可取.这将导致updateTimestamps()尝试在模型不脏(没有字段更改)时将日期保存到null属性,从而引发错误.只是尝试保存空模型或触摸()现有模型以查看此信息.这也会导致getDates()返回['created_at',null],如果您以某种方式无意中使用null键(将其转换为空字符串)在模型上设置属性,则可能会导致问题.我相信JustAMartin的解决方案是最完整的. (7认同)
  • 十分优雅!最好的办法! (3认同)
  • @hackel 对于 Laravel 5.8 来说是错误的,源代码明确表示 `if (! is_null(static::UPDATED_AT) &&` 好吧,他/她关于使用源代码的说法是正确的,但他/她在称呼别人名字方面并不政治正确。 (3认同)
  • `const UPDATED_AT = null;` 阻止 Laravel 尝试更新表中的 updated_at 字段。 (2认同)

Abr*_*hin 23

我有更好的回答这里Laravel 5.2或以上.

你可以在模特中使用它 -

class User extends Model
{
    public $timestamps = false; // disable all behavior
    public $timestamps = true; // enable all behavior
    public $timestamps = [ "created_at" ]; // enable only to created_at
    public $timestamps = [ "updated_at" ]; // enable only to updated_at
    public $timestamps = [ "created_at", "updated_at" ]; // same as true, enable all behavior
}
Run Code Online (Sandbox Code Playgroud)

那么,对于你的问题,答案是 -

public $timestamps = [ "created_at" ]; // enable only to created_at
Run Code Online (Sandbox Code Playgroud)

  • 它适用于Laravel 5.2或+ (3认同)
  • 如果不亲自研究供应商代码,请不要使用此答案.这不起作用,因为它仍然是一个提案,尚未实施(现在5.3). (3认同)
  • 在 Laravel 5.8 中不起作用,它给我一个错误“未找到列:1054“字段列表”中的未知列“updated_at”” (3认同)
  • 公共$时间戳= [“创建时间”]; 在 Laravel 5.5.13 中仍然不起作用。 (2认同)
  • **public $timestamps = [ "created_at" ];** 在 laravel 6 中不起作用 (2认同)

小智 12

我的解决方案

class CreatePostsTable extends Migration {

   public function up() {

      Schema::create('posts', function(Blueprint $table){

         $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
   });
}
Run Code Online (Sandbox Code Playgroud)

这适合我

  • 您的 PHP 脚本可能使用与您的数据库不同的时区。 (3认同)
  • 但如果你真的需要它,最好使用 `$table->timestamp('created_at')->useCurrent();` (3认同)

pab*_*rsk 7

自 Laravel 5.*

模型:

//  Disable updated_at (only created_at)
class Book extends Model
{
     const UPDATED_AT = null;

     /* ... */
}
Run Code Online (Sandbox Code Playgroud)

移民:

Schema::create('books', function (Blueprint $table): void {
    /* ... */
    $table->timestampTz('created_at')->nullable();
});
Run Code Online (Sandbox Code Playgroud)

  • 这是在 2020 年实现这一目标的正确方法。不再需要已接受的答案。 (5认同)

小智 5

我通过CURRENT_TIMESTAMP在我的数据库中为 column添加默认值来解决created_at。在我的模型中,我使用下面的代码

public $timestamps = false;
protected $dates = ['created_at'];
Run Code Online (Sandbox Code Playgroud)

我希望这种方法适用于所有版本的 Laravel。