[英]Is there anyway to assign a default value of a table equal to the id itself?
所以我想将列order
的default value
设置order
等于id
。 这几乎是出于排序目的。
有没有办法做到这一点? 或者有没有更好的方法来达到同样的目的?
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->bigInteger('order');
$table->string('path');
$table->text('description')->default('');
$table->timestamps();
});
你不能用 laravel 和迁移来做到这一点,mysql 在表创建时不支持它。
您可以创建一个 mysql 触发器来在插入时设置该字段https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html
真正的问题是,为什么你只是为了排序的原因想要一个相同的字段?
每次在帖子表中创建/保存新条目后,只需获取行的 id 并再次保存:
$post->save();
$post->order = $post->id;
$post->save();
这并不理想,因为它需要为每个帖子创建进行额外的数据库操作,但实际上,除非您的项目变得非常大,否则它可能永远不会成为问题。
不,你不能让它自动化。
即使在具有表达式默认值的 MySQL 8.0 中。 请参阅https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html ,其中说:
表达式默认值不能依赖于具有 AUTO_INCREMENT 属性的列。
你不能写一个触发器来做到这一点。 您只能在BEFORE INSERT
触发器中更改列值。 但是您的id
列的自动增量值当时尚未生成。 自动增量值仅在AFTER INSERT
触发器中可用,但到那时,您无法修改行的列,因为它已经插入。
做你想做的唯一方法是插入行,然后运行另一个 SQL UPDATE 将自动增量值从您的id
列复制到您的order
列。
您可以通过以下方式进行。 created 事件一旦创建就会被调用,并且永远不会调用更新
class Post extends Model
{
protected static function booted() {
self::created(function (self $post){
$post->order = $post->id;
$post->save();
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.