我只想使用created_at,怎么做?
我知道:
这可以是自定义时间戳名称
const CREATED_AT = 'created';
const UPDATED_AT = 'updated';
这可以禁用时间戳
public $timestamps = false;
答案 0 :(得分:67)
Eloquent不提供开箱即用的功能,但您可以使用creating
事件回调自行创建:
class User extends Eloquent {
public $timestamps = false;
public static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->created_at = $model->freshTimestamp();
});
}
}
答案 1 :(得分:44)
使用在顶部:
const UPDATED_AT = null;
对于'created_at'字段,您可以使用:
const CREATED_AT = null;
更新LARAVEL 5.5.0 - 5.5.5
这已被破坏in Laravel 5.5.0(并再次修复in 5.5.5)。
如果您使用的是5.5.x,请确保您使用的是最新版本。
如果由于某种原因你不能使用最新版本,这是一种解决方法。
将公共$ timestamps设置为false:
public $timestamps = false;
必要时:
public function setCreatedAtAttribute($value) {
$this->attributes['created_at'] = \Carbon\Carbon::now();
}
OR
public function setUpdatedAtAttribute($value) {
$this->attributes['updated_at'] = \Carbon\Carbon::now();
}
当需要两个字段“created_at”和“updated_at”时,您当然不需要做任何事情;)
答案 2 :(得分:18)
here Laravel 5.2 or above为https://www.codeigniter.com/user_guide/libraries/form_validation.html提供了更好的答案。
U可以在模型中使用它 -
class User extends Model
{
public $timestamps = false; // disable all behaviour
public $timestamps = true; // enable all behaviour
public $timestamps = [ "created_at" ]; // enable only to created_at
public $timestamps = [ "updated_at" ]; // enable only to updated_at
public $timestamps = [ "created_at", "updated_at" ]; // same that true
}
所以,对于你的问题,答案是 -
public $timestamps = [ "created_at" ]; // enable only to created_at
答案 3 :(得分:12)
我的解决方案:
class CreatePostsTable extends Migration {
public function up() {
Schema::create('posts', function(Blueprint $table){
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
});
}
这对我有用
答案 4 :(得分:3)
要仅禁用updated_at,您可以覆盖Model :: setUpdatedAt()方法,如下所示:
public function setUpdatedAt($value) {
// Do nothing.
}
当然,如果你想为created_at列做这件事,那就简单了。这对Laravel 5.1来说很有用。
答案 5 :(得分:3)
我通过在我的数据库中为列CURRENT_TIMESTAMP
添加默认值created_at
来解决。在我的模型中,我使用下面的代码
public $timestamps = false;
protected $dates = ['created_at'];
我希望这种方法适用于所有版本的laravel。
答案 6 :(得分:2)
在版本5.3中,我刚刚public $timestamps = false;
,然后添加了受保护的$ fillable = [' created_at']。注意:您可以添加任何所需内容,只需确保它与表格中的内容匹配即可。
答案 7 :(得分:1)
仅使用setUpdatedAt
的方法不适用于Laravel 5.1.7,因为它还有一个地方可以处理updated_at
。
模型类performUpdate方法调用Builder类方法:
public function update(array $values)
{
return $this->query->update($this->addUpdatedAtColumn($values));
}
引导我们
return Arr::add($values, $column, $this->model->freshTimestampString());
我不确定,为什么Laravel正在处理updated_at两次 - 在performUpdate
中使用$this->updateTimestamps()
,然后在Builder中使用$this->addUpdatedAtColumn($values)
处理。
通过一些调试,我发现你还必须使用getUpdatedAtColumn覆盖来更新你的模型。起初我担心它会尝试更新一个不存在的字段“null”,但事实证明Arr::add
足够聪明,可以忽略空键。
因此,在您的模型类中添加以下内容:
public function setUpdatedAt($value)
{
// Do nothing.
}
public function getUpdatedAtColumn()
{
return null;
}
这应该足以禁用这两个更新。
答案 8 :(得分:1)
在课程顶部使用
const UPDATED_AT = null;
或
const CREATED_AT = null;
答案 9 :(得分:0)
简单,解耦和可重用的解决方案是使用模型观察器。我们的想法是捕获creating
事件并填充created_at
属性。任何数量的模型都可以使用此方法,而无需重复代码或使用非官方技巧。最重要的是,它非常类似于Model类的内部机制,从而避免了意外错误。
1)在SetCreatedAt
中创建App\Observers
观察者:
namespace App\Observers;
use Illuminate\Database\Eloquent\Model;
class SetCreatedAt
{
/**
* Sets created_at when creating the model.
*
* @param Model $model
* @return void
*/
public function creating(Model $model)
{
$model->setCreatedAt($model->freshTimestamp());
}
}
2)在App\Providers\AppServiceProvider
方法内的boot
上,为您希望为其生成created_at
的每个模型添加以下行:
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// Replace OrderLog with your model
OrderLog::observe(SetCreatedAt::class);
}
3)在您的模型上,您唯一需要做的就是禁用时间戳:
// Disable timestamps on the model
public $timestamps = false;
使用Laravel 5.3进行测试,但它也适用于以前的版本。
祝你好运!答案 10 :(得分:0)
对于在这里寻找 updated_at
而不是 created_at
的任何人,但其他答案似乎都不适合您:
在 Laravel 8 中,您需要将模型属性 CREATED_AT
设置为 null
,将 UPDATED_AT
设置为 'updated_at' 或任何其他您想要为您的 updated_at 字段命名的名称。
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The name of the "created at" column.
*
* @var string|null
*/
const CREATED_AT = null;
/**
* The name of the "updated at" column.
*
* @var string|null
*/
const UPDATED_AT = 'updated_at';
public function setCreatedAt($value)
{
// do nothing
}
}
还有你的迁移...
Schema::create('users', function (Blueprint $table) {
// ...
$table->timestamp('updated_at'); // instead of $table->timestamps();
});
我不确定为什么需要在模型中设置此属性,因为它已在父类 Illuminate\Database\Eloquent\Model
中设置,但它仅在我进行此更改后才对我有用。
答案 11 :(得分:0)
对于Laravel 5。*
型号:
// Disable updated_at (only created_at)
class Book extends Model
{
const UPDATED_AT = null;
/* ... */
}
迁移:
Schema::create('books', function (Blueprint $table): void {
/* ... */
$table->timestampTz('created_at')->nullable();
});
答案 12 :(得分:0)
在您的model
上
const UPDATED_AT = null;
或
const CREATED_AT = null;
它停止Laravel尝试更新updated_at / created_at字段
它适用于Laravel 5.8
总比覆盖setUpdatedAt
中的model
public function setUpdatedAt($value) : self
{
// Do nothing.
return $this;
}
因为它更短,并且因为在源代码中对if (! is_null(static::UPDATED_AT)
的检查比触发要早
setUpdatedAt
答案 13 :(得分:0)
在5.4中,它给出的问题是即使在更新(Eloquent update)之后它也不会填充updated_at字段。
改为添加此方法
public function setUpdatedAtAttribute($value)
{
// auto disable update_at in inserts
}
答案 14 :(得分:0)
我的解决方法是使用新的__construct
方法。
请参阅:
class MyModel extends Eloquent {
public $timestamps = false;
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->attributes['created_at'] = $this->freshTimestamp();
}
}
答案 15 :(得分:-1)
您可以在MySQL表中使用CURRENT_TIMESTAMP默认值mv
字段并设置
created
在您的模型中。
答案 16 :(得分:-1)
在Laravel 5.7 中,这足以让我工作:
正在迁移:
$table->timestamp('created_at')->nullable();
代替经典的$table->timestamp('created_at');
在模型中:
const UPDATED_AT = null;
答案 17 :(得分:-3)
我使用了非常简单的黑客;)
类MyClass扩展了Model {
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'creation_date';
}
我只是指向同一列:)