当前位置: 首页 > 知识库问答 >
问题:

如何使用架构生成器添加虚拟列?

戚晨
2023-03-14

我正在创建一个这样的表,

Schema::create('booking_segments', function (Blueprint $table) {
    $table->increments('id');

    $table->datetime('start')->index();
    $table->integer('duration')->unsigned();
    $table->string('comments');
    $table->integer('booking_id')->unsigned();
    $table->foreign('booking_id')->references('id')->on('bookings')->onDelete('cascade');
});

但我想增加一列。在原始SQL中看起来是这样的:

ALTER TABLE booking_segments ADD COLUMN `end` DATETIME AS (DATE_ADD(`start`, INTERVAL duration MINUTE)) PERSISTENT AFTER `start`

如何将其添加到迁移中?我还需要在上面创建一个索引。

共有3个答案

尉迟哲瀚
2023-03-14

您也可以使用Laravel Events来实现相同的结果,而无需使用存储或虚拟。参考:Laravel:使用查询生成器或雄辩的ORM时,在每次插入/更新时执行一些任务

我就是这样做的:

class MyModel extends Model
{
    /** .... **/

    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::creating(function ($option) {
            $option->column1 = $option->column2 + 2;
        });

        static::updating(function ($option) {
            $option->column1 = $option->column2 + 2;
        });
    }
}
彭令秋
2023-03-14

我认为您不能使用schema builder(如果我错了,请有人纠正我),但您可以始终“回退”到原始SQL:

DB::statement('ALTER TABLE booking_segments ADD COLUMN `end` DATETIME AS (DATE_ADD(`start`, INTERVAL duration MINUTE)) PERSISTENT AFTER `start`');
谭鹏云
2023-03-14

我知道这是一个老问题,但是有一种方法可以使用自Laravel5.3以来的SchemaBuilder来完成,所以我想为了完整性,我把它放在这里。

您可以使用laravel 5.3列修饰符virtualAs或storedAs。

因此,要创建一个虚拟生成的列以在每次查询时进行计算,您可以创建如下列:

$table->dateTime('created_at')->virtualAs( 'DATE_ADD(`start`, INTERVAL duration MINUTE)' );

要创建存储的生成列,您可以创建如下列:

$table->dateTime('created_at')->storedAs( 'DATE_ADD(`start`, INTERVAL duration MINUTE)' );
 类似资料:
  • 这在某个时间点上很有效,但我有一个用例,在应用程序运行时可以添加用户。 我可以通过哪种方法(通过控制器/服务)进行启动后操作?我想它可能是(它包含方法),但我不确定如何引用或配置它。

  • 我想使用Swagger YML文件生成一个模拟服务器,供其他服务连接(例如,前端应用程序连接到模拟API)。

  • 问题内容: 我将Hibernate更新为4.1.1.Final版本。根据文档, 有两种方法可以生成数据库模式: 蚂蚁任务。 从Java 运行。 Hibernate- tools不适用于Hibernate-4.1.1.Final。它具有阻止错误。 我只发现发行说明和测试用例。那么如何与我的persistence.xml和Maven一起使用? 更新: 在Hibernate论坛上找到了相关主题。我的问题

  • 问题内容: 我想生成一个日期列表,希望能与另一个表连接,但是我不知道要使用什么语法,类似于以下内容: 我想要日期,因此不必在客户端进一步处理数据。我正在使用它来显示类似于此的表: 问题答案: 日期清单 使用generate_series函数获取可以添加到日期的数字列表,以获取日期列表: 结果: 旋转 问题的后半部分涉及透视结果集- 将行数据转换为列数据。PIVOT和UNPIVOT是ANSI,但我目

  • 我的任务是为OpenShift生产环境推荐VM配置。OpenShift安装文档并没有详细说明很多不同的选项。我知道我们需要高可用性(这意味着多个主机),但我有点困惑的是: etcd的单独主机 基础设施节点 etcd需要单独的主机/节点吗?(优势似乎与性能有关,但希望更好地理解) 基础架构组件(注册表、路由器等)是否需要单独的主机/节点,还是可以将它们托管在主节点上?

  • 我想使用swagger-codegen生成我的假客户端代码,但我找不到能够引导我这样做的文档。 我有一个使用spring cloud的微服务,几个使用spring-cloud-feign接口请求数据的API服务。我希望我能生成feign客户端代码。 我很困惑如何生成我所有的代码?似乎几乎没有指南、文档或演示?