如何在Laravel中仅使用created_at

时间:2015-04-27 03:03:38

标签: php laravel

我只想使用created_at,怎么做?

我知道:

这可以是自定义时间戳名称

const CREATED_AT = 'created';
const UPDATED_AT = 'updated';

这可以禁用时间戳

public $timestamps = false;

18 个答案:

答案 0 :(得分:67)

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

class User extends Eloquent {

    public $timestamps = false;

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

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

}

答案 1 :(得分:44)

使用在顶部:

const UPDATED_AT = null;

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

const CREATED_AT = null;

更新LARAVEL 5.5.0 - 5.5.5

这已被破坏in Laravel 5.5.0(并再次修复in 5.5.5)。

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

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

将公共$ timestamps设置为false:

public $timestamps = false;

必要时:

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

OR

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

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

答案 2 :(得分:18)

here Laravel 5.2 or abovehttps://www.codeigniter.com/user_guide/libraries/form_validation.html提供了更好的答案。

U可以在模型中使用它 -

class User extends Model
{
    public $timestamps = false; // disable all behaviour
    public $timestamps = true; // enable all behaviour
    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 that true
}

所以,对于你的问题,答案是 -

public $timestamps = [ "created_at" ]; // enable only to created_at

答案 3 :(得分:12)

我的解决方案:

class CreatePostsTable extends Migration {

   public function up() {

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

         $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
   });
}

这对我有用

答案 4 :(得分:3)

要仅禁用updated_at,您可以覆盖Model :: setUpdatedAt()方法,如下所示:

public function setUpdatedAt($value) {
    // Do nothing.
}

当然,如果你想为created_at列做这件事,那就简单了。这对Laravel 5.1来说很有用。

答案 5 :(得分:3)

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

public $timestamps = false;
protected $dates = ['created_at'];

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

答案 6 :(得分:2)

在版本5.3中,我刚刚public $timestamps = false;,然后添加了受保护的$ fillable = [' created_at']。注意:您可以添加任何所需内容,只需确保它与表格中的内容匹配即可。

答案 7 :(得分:1)

仅使用setUpdatedAt的方法不适用于Laravel 5.1.7,因为它还有一个地方可以处理updated_at

模型类performUpdate方法调用Builder类方法:

public function update(array $values)
{
    return $this->query->update($this->addUpdatedAtColumn($values));
}

引导我们

return Arr::add($values, $column, $this->model->freshTimestampString());

我不确定,为什么Laravel正在处理updated_at两次 - 在performUpdate中使用$this->updateTimestamps(),然后在Builder中使用$this->addUpdatedAtColumn($values)处理。

通过一些调试,我发现你还必须使用getUpdatedAtColumn覆盖来更新你的模型。起初我担心它会尝试更新一个不存在的字段“null”,但事实证明Arr::add足够聪明,可以忽略空键。

因此,在您的模型类中添加以下内容:

public function setUpdatedAt($value)
{
    // Do nothing.
}

public function getUpdatedAtColumn()
{
    return null;
}

这应该足以禁用这两个更新。

答案 8 :(得分:1)

在课程顶部使用

const UPDATED_AT = null;

const CREATED_AT = null;

答案 9 :(得分:0)

简单,解耦和可重用的解决方案是使用模型观察器。我们的想法是捕获creating事件并填充created_at属性。任何数量的模型都可以使用此方法,而无需重复代码或使用非官方技巧。最重要的是,它非常类似于Model类的内部机制,从而避免了意外错误。

1)在SetCreatedAt中创建App\Observers观察者:

namespace App\Observers;

use Illuminate\Database\Eloquent\Model;

class SetCreatedAt
{
    /**
     * Sets created_at when creating the model.
     *
     * @param Model $model
     * @return void
     */
    public function creating(Model $model)
    {
        $model->setCreatedAt($model->freshTimestamp());
    }
}

2)在App\Providers\AppServiceProvider方法内的boot上,为您希望为其生成created_at的每个模型添加以下行:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    // Replace OrderLog with your model
    OrderLog::observe(SetCreatedAt::class);
}

3)在您的模型上,您唯一需要做的就是禁用时间戳:

// Disable timestamps on the model
public $timestamps = false;

使用Laravel 5.3进行测试,但它也适用于以前的版本。

祝你好运!

答案 10 :(得分:0)

对于在这里寻找 updated_at 而不是 created_at 的任何人,但其他答案似乎都不适合您:

在 Laravel 8 中,您需要将模型属性 CREATED_AT 设置为 null,将 UPDATED_AT 设置为 'updated_at' 或任何其他您想要为您的 updated_at 字段命名的名称。

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The name of the "created at" column.
     *
     * @var string|null
     */
    const CREATED_AT = null;

    /**
     * The name of the "updated at" column.
     *
     * @var string|null
     */
    const UPDATED_AT = 'updated_at';


    public function setCreatedAt($value)
    {
        // do nothing
    }
}

还有你的迁移...

Schema::create('users', function (Blueprint $table) {
    // ...
    $table->timestamp('updated_at'); // instead of $table->timestamps();
});

我不确定为什么需要在模型中设置此属性,因为它已在父类 Illuminate\Database\Eloquent\Model 中设置,但它仅在我进行此更改后才对我有用。

答案 11 :(得分:0)

对于Laravel 5。*

型号:

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

     /* ... */
}

迁移:

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

答案 12 :(得分:0)

在您的model

const UPDATED_AT = null;

const CREATED_AT = null;

它停止Laravel尝试更新updated_at / created_at字段

它适用于Laravel 5.8

总比覆盖setUpdatedAt中的model

好。
public function setUpdatedAt($value) : self 
{
    // Do nothing.
    return $this;
}

因为它更短,并且因为在源代码中对if (! is_null(static::UPDATED_AT)的检查比触发要早 setUpdatedAt

答案 13 :(得分:0)

在5.4中,它给出的问题是即使在更新(Eloquent update)之后它也不会填充updated_at字段。

改为添加此方法

public function setUpdatedAtAttribute($value)
{
    // auto disable update_at in inserts 
}

答案 14 :(得分:0)

我的解决方法是使用新的__construct方法。

请参阅:

class MyModel extends Eloquent {

    public $timestamps = false;

    public function __construct(array $attributes = [])
    {
            parent::__construct($attributes);

            $this->attributes['created_at'] = $this->freshTimestamp();
    }
}

答案 15 :(得分:-1)

您可以在MySQL表中使用CURRENT_TIMESTAMP默认值mv字段并设置

created

在您的模型中。

答案 16 :(得分:-1)

在Laravel 5.7 中,这足以让我工作:

正在迁移:

$table->timestamp('created_at')->nullable();

代替经典的$table->timestamp('created_at');

在模型中:

const UPDATED_AT = null;

答案 17 :(得分:-3)

我使用了非常简单的黑客;)

类MyClass扩展了Model {

const CREATED_AT = 'creation_date';
const UPDATED_AT = 'creation_date';

}

我只是指向同一列:)