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