雄辩的属于多关系使用自定义中间表模型,无需'updated_at'字段



我使用的是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时间戳的更多信息,请参见

最新更新