禁用 Laravel 的 Eloquent 时间戳

Posted

技术标签:

【中文标题】禁用 Laravel 的 Eloquent 时间戳【英文标题】:Disable Laravel's Eloquent timestamps 【发布时间】:2013-11-25 02:19:49 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

    //

【讨论】:

【参考方案2】:

您可以暂时禁用时间戳

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

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

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

【讨论】:

【参考方案3】:

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

覆盖现有变量$timestamps truefalse

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

public $timestamps = false;

【讨论】:

【参考方案4】:

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

public $timestamps = false;

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

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

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

【讨论】:

这应该是最好的答案。如果您有现有的生产数据库,则需要运行迁移并在模型上禁用时间戳。【参考方案5】:

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

public $timestamps = false;

【讨论】:

【参考方案6】:

如果您使用的是 5.5.x:

const UPDATED_AT = null;

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

const CREATED_AT = null;

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

【讨论】:

【参考方案7】:

雄辩模型:

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

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

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

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

public function setUpdatedAt($value)

   //Do-nothing


public function getUpdatedAtColumn()

    //Do-nothing

【讨论】:

一个案例“它有效,但没有一个头脑正常的人会真正做到这一点”【参考方案10】:

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

public function setUpdatedAtAttribute($value)

    // to Disable updated_at

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

【讨论】:

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

以上是关于禁用 Laravel 的 Eloquent 时间戳的主要内容,如果未能解决你的问题,请参考以下文章

更新附加/分离 Eloquent 关系的时间戳

Laravel eloquent结合max()和where()或有()

在 Eloquent 中对时间戳进行排序

更新而不触及时间戳(Laravel)

1+X web中级 Laravel学习笔记——Eloquent ORM查询更新删除新增

是否有可能暂时禁用Laravel中的事件?