繁体   English   中英

无论如何分配一个表的默认值等于 id 本身?

[英]Is there anyway to assign a default value of a table equal to the id itself?

所以我想将列orderdefault 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();
        });
    }
}

Laravel 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM