我使用的是Laravel 8,在我的应用程序中,我有属于许多自定义模型的关系,我想删除'updated_at'字段。
与
public function tracks()
{
return $this->belongsToMany(Track::class)
->using(CollectionTrack::class)
->withPivot('sort' , 'created_at' , 'id');
}
<<p>自定义模型/strong>class CollectionTrack extends Pivot
{
use Sortable;
public const UPDATED_AT = null;
public $incrementing = true;
public static function enableAutoSort () {
return false;
}
}
问题是,当我想要同步时,它试图填充updated_at
字段。
列未找到:1054未知列'updated_at'在'字段列表'
但是,我使用以下行从Model中删除了updated_at。
public const UPDATED_AT = null;
并且,只得到withPivot
中的created_at。
当我从withPivot中删除created_at
时,问题就消失了,但在这种情况下,当我检索数据时,created_at
将不在字段中。
注意:我的目标是禁用updated_at
时间戳,只有created_at
,所以当我附加一个新记录,created_at集,当我检索它,模型有这些透视字段'sort', 'created_at', 'id.'
我认为您可以从迁移中删除$table->timestamps()
,只需添加具有默认值当前时间戳的created_at
字段。
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
应该可以。
你可以参考另一个答案
您要么必须在每个模型中声明public $timestamps = false;
,要么创建BaseModel
,在那里定义它,并让您的所有模型扩展它,而不是雄辩。只要记住,如果你使用Eloquent,数据透视表必须有时间戳。
更新:请注意,在Laravel v3之后,数据透视表中不再需要时间戳。
更新:您还可以通过从迁移
中删除$table->timestamps()
来禁用时间戳。原始答案:https://stackoverflow.com/a/59171175/14290461
在您的模型中添加以下两行:
public $timestamps = ["created_at"]; //only want to used created_at column
const UPDATED_AT = null; //and updated by default null set
第二种方式:
public $timestamps = false; //by default timestamp false
添加如下函数:
public function setCreatedAtAttribute($value) {
$this->attributes['created_at'] = CarbonCarbon::now();
}
有关laravel时间戳的更多信息,请参见