246

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

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

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

但是,我宁愿不更改 Laravel 的核心文件,或者让我的每个模型都将其放在顶部。有没有办法在其他地方为所有型号禁用此功能?

4

10 回答 10

456

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

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

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

于 2013-11-12T19:01:36.263 回答
166

只需将此行放在您的 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
{
    //
}
于 2014-11-01T13:49:39.383 回答
36

如果您使用的是 5.5.x:

const UPDATED_AT = null;

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

const CREATED_AT = null;

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

于 2018-07-17T06:43:09.830 回答
23

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

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

这将覆盖父 setUpdatedAtAttribute() 方法。created_at 将照常工作。同样的方式你可以编写一个方法来禁用更新 created_at 。

于 2014-09-11T10:12:19.140 回答
15

如果您想从现有模型中删除时间戳,如前所述,请将其放在您的模型中:

public $timestamps = false;

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

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

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

于 2018-08-31T19:29:15.467 回答
13

口才模型:

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();
于 2017-10-21T19:38:34.067 回答
9

将此行添加到您的模型中:

将现有变量$timestamps true覆盖为false

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

public $timestamps = false;
于 2019-04-16T06:25:14.803 回答
8

只需在您的to中声明publictimestamps 变量,一切都会很好。Modelfalse

public $timestamps = false;

于 2018-07-04T07:50:30.380 回答
3

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

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

public function getUpdatedAtColumn()
{
    //Do-nothing
}
于 2015-01-10T09:06:13.253 回答
1

您可以暂时禁用时间戳

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

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

$user->timestamps=$timestamps;   // restore timestamps
于 2019-09-28T17:55:44.037 回答