禁用Laravel雄辩的时间戳


184

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

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

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

但是,我不想更改Laravel的核心文件,或者不要让我的每个模型都放在顶部。有什么方法可以在所有型号的其他位置禁用此功能吗?

Answers:


358

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

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

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


1
不知道为什么我从未想到要做一个BaseModel并在那里设置它。做工精美。仅根据文档数据透视表的注释,仅当现在设置withTimestamps()时才需要它(不知道这与以前的版本是否有所不同)
projectxmatt

不知道withTimestamps()方法。我需要调查一下。
bgallagh3r 2013年

@ bgallagh3r,反正只能用于perticuler查询,可以说对于fontend显示我不想要时间戳,但是对于后端我想要时间戳。反正有这样做吗?
user7747472

8
当从迁移中删除$ table-> timestamps()时,雄辩的将其仍包含在查询中。由于该字段不存在,这将导致错误。否则,很好的答案。
Thijs Steel

114

只需将这条线放在模型中

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
{
    //
}

22

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

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

这将覆盖父setUpdatedAtAttribute()方法。created_at将照常工作。您可以使用相同的方法编写仅禁用更新created_at的方法。


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

它对我有用,此方法只是禁用了我需要的updated_at字段,谢谢
Radames E. Hernandez

21

如果您使用的是5.5.x:

const UPDATED_AT = null;

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

const CREATED_AT = null;

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


10

雄辩的模型:

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();

9

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

public $timestamps = false;

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

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

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


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

6

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

public $timestamps = false;


5

将此行添加到模型中:

将现有变量覆盖为$timestamps truefalse

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

public $timestamps = false;

1

覆盖功能setUpdatedAt()getUpdatedAtColumn()模型

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

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

20
一种情况“有效,但在他们的正确思维中没有人会这样做”
developerbmw

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.