ChatGPT解决这个技术问题 Extra ChatGPT

禁用 Laravel 的 Eloquent 时间戳

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

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

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

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


J
John

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

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

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


不知道为什么我从来没想过做一个 BaseModel 并将其设置在那里。工作精美。仅当现在设置 withTimestamps() 时才需要根据文档数据透视表进行注释(不知道这是否与以前的版本有所不同)
不知道 withTimestamps() 方法。我需要调查一下。
@bgallagh3r,无论如何只能为 perticuler 查询禁用,可以说对于字体显示我不想要时间戳,但对于后端我想要时间戳。反正有这样做吗?
从迁移中删除 $table->timestamps() 时,eloquent 仍会将它们包含在查询中。这会导致错误,因为该字段不存在。否则很好的答案。
是的,今天仍然如此(Laravel Framework v7.22.4)。发现这个线程试图解决这个问题。您必须通过 $timestamps = false; 显式禁用时间戳,例如,为没有任何 created_atupdated_at 字段的表播种。
p
pimarc

只需将此行放在您的模型中:

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

D
Dumindu Perera

如果您使用的是 5.5.x:

const UPDATED_AT = null;

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

const CREATED_AT = null;

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


D
Dumindu Perera

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

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

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


这对我有用,因为设置 $timestamps = false 导致 created_at->diffForHumans() 方法停止工作,因为它不再是碳实例。
它对我有用,这种方法只是禁用了我需要的 updated_at 字段,谢谢
r
realplay

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

public $timestamps = false;

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

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

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


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

口才模型:

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

k
koen

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

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

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

public $timestamps = false;

S
Shahrukh Anwar

只需将 Model 中的 public 时间戳变量声明为 false,一切都会很好。

public $timestamps = false;


Z
Zak Henry

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

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

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

一个“它有效,但没有一个头脑正常的人会真正做到这一点”的案例
S
Snapey

您可以暂时禁用时间戳

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

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

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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅