禁用laravel&# 39;s Eloquent时间戳

我正在将我们的一个web应用程序从CodeIgniter转换为Laravel。然而,目前我们不想将updated_at / created_at字段添加到所有的表中,因为我们已经有一个日志类,它已经为我们做了更深入的工作。

我知道我可以在以下语句中设置$timestamps = false;:

Vendor\laravel\framework\src\illuminate\Datebase\Eloquent\Model.php

然而,我宁愿不改变Laravel的核心文件,或者让我的每个模型都在顶部。有没有办法在其他地方禁用所有模型?

373268 次浏览

你要么必须在每个模型中声明public $timestamps = false;,要么创建一个BaseModel,在那里定义它,并让所有的模型扩展它,而不是eloquent。只要记住数据透视表必须有时间戳,如果你使用雄辩。

更新:请注意,在Laravel v3之后,数据透视表不再需要时间戳。

更新:您也可以通过从迁移中删除$table->timestamps()来禁用时间戳。

如果您只需要禁用更新updated_at,只需将此方法添加到您的模型中。

public function setUpdatedAtAttribute($value)
{
// to Disable updated_at
}
这将覆盖父setUpdatedAtAttribute()方法。Created_at将照常工作。 同样地,你可以写一个方法来禁用只更新created_at

只需将这一行放入您的Model中:

public $timestamps = false;

就是这样!


例子:

<?php


namespace App;


use Illuminate\Database\Eloquent\Model;


class Post extends Model
{
public $timestamps = false;


//
}

禁用时间戳对于一个操作(例如在控制器中):

$post->content = 'Your content';
$post->timestamps = false; // Will not modify the timestamps on save
$post->save();

要禁用时间戳所有的模特,创建一个新的BaseModel文件:

<?php


namespace App;


use Illuminate\Database\Eloquent\Model;


class BaseModel extends Model
{
public $timestamps = false;


//
}

然后用BaseModel扩展你的每个模型,如下所示:

<?php


namespace App;


class Post extends BaseModel
{
//
}

覆盖你的模型中的setUpdatedAt()getUpdatedAtColumn()函数

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


public function getUpdatedAtColumn()
{
//Do-nothing
}

雄辩的模型:

class User extends Model
{
protected $table = 'users';


public $timestamps = false;
}

或者简单地试试这个

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = 'johndoe@example.com';
$users->save();

只要在你的Modelfalse中声明public时间戳变量,一切都会正常工作。

public $timestamps = false; < /代码> < / p >

如果您正在使用5.5.x:

const UPDATED_AT = null;

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

const CREATED_AT = null;

确保您使用的是最新版本。 (这在Laravel 5.5.0中被打破,并在5.5.5中再次修复)

如果你想从现有的模型中删除时间戳,就像前面提到的,把这个放在你的模型中:

public $timestamps = false;

up()方法中使用以下代码创建一个迁移并运行它:

Schema::table('your_model_table', function (Blueprint $table) {
$table->dropTimestamps();
});

可以在down()方法中使用$table->timestamps()来允许回滚。

将这一行添加到您的模型中:

将现有变量$timestamps 真正的重写为

/**
* Indicates if the model should be timestamped.
*
* @var bool
*/


public $timestamps = false;

您可以暂时禁用时间戳

$timestamps = $user->timestamps;
$user->timestamps=false;   // avoid view updating the timestamp


$user->last_logged_in_at = now();
$user->save();


$user->timestamps=$timestamps;   // restore timestamps