禁用Laravel的Eloquent时间戳

pro*_*att 163 php laravel eloquent

我正在将我们的一个Web应用程序从CodeIgniter转换为Laravel.但是此时我们不想将updated_at/ created_atfields 添加到所有表中,因为我们已经有了一个日志类,它已经为我们更深入地完成了所有这些.

我知道我可以$timestamps = false;进入:

Vendor\laravel\framework\src\illuminate\Datebase\Eloquent\Model.php
Run Code Online (Sandbox Code Playgroud)

但是我宁愿不为Laravel更改核心文件,也不要让我的每个模型都在顶部.有没有办法在其他所有型号禁用它?

bga*_*h3r 328

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

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

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

  • 从迁移中删除$ table-> timestamps()时,eloquent仍会将它们包含在查询中.由于该字段不存在,这会导致错误.否则很好的答案. (6认同)

Phi*_*arc 97

只需放入public $timestamps = false;您的模型即可.


Sam*_*era 22

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

public function setUpdatedAtAttribute($value)
{
    // to Disable updated_at
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我有用,因为设置$ timestamps = false会导致created_at-> diffForHumans()方法停止工作,因为它不再是Carbon实例。 (2认同)

Sam*_*era 18

如果您使用的是5.5.x:

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中再次修复).


小智 9

雄辩的模型:

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

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

或者只是试试这个

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


rea*_*lay 8

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

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

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

Schema::table('your_model_table', function (Blueprint $table) {
    $table->dropTimestamps();
});
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是最好的答案。如果您有现有的生产数据库,则需要运行迁移并禁用模型上的时间戳。 (2认同)

Jig*_*sar 8

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

覆盖现有变量$timestamps

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

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


Sha*_*war 5

只需public在您的Modelto中声明timestamps变量false,一切都会很好。

public $timestamps = false;