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

我知道我可以设置$timestamps = false;:

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

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


当前回答

您可以暂时禁用时间戳

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

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

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

其他回答

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

将现有变量$timestamps的true重写为false

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

public $timestamps = false;

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

public function setUpdatedAtAttribute($value)
{
    // to Disable updated_at
}

这将覆盖父setUpdatedAtAttribute()方法。Created_at将照常工作。 同样地,您可以编写一个方法来禁用仅更新created_at。

重写模型中的setUpdatedAt()和getUpdatedAtColumn()函数

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

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

简单地把这一行放在你的模型中:

公共$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
{
    //
}

如果您正在使用5.5.x:

const UPDATED_AT = null;

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

const CREATED_AT = null;

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