MySQL 和 SQLite(从 3.31.0 版开始)支持生成的列定义。让我们看看如何在我们的数据库模式中使用计算列,以及在什么情况下我们应该将它们添加到我们的迁移中。
虚拟列和存储列
基本上有两种类型的计算列:virtual和stored。两者之间的主要区别是 virtual 每次用户运行查询时都会计算,但它不占用任何空间,但是,存储的数据需要一些空间,但每次行获取时都会更新插入或更新。简而言之:虚拟“更小”但“更慢”,存储“更大”但更快。
让我们看看一些 SQL,如何创建计算列:
drop table if exists users;
create table users (
id int auto_increment primary key,
first_name varchar(50) not null,
last_name varchar(50) not null,
salary int(10) not null,
name varchar(101) as (concat(first_name, ' ', last_name)),
insurance int(10) as (salary * 0.1) stored
);
如我们所见,我们可以根据行中的其他列生成列。在某些情况下,这可能非常方便,特别是如果我们想让这些计算自动化。
迁移模式中的计算列
现在,让我们看看如何在 Laravel 迁移中添加计算列。
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->integer('price');
$table->integer('tax')->virtualAs('price * 0.27')->nullable();
$table->integer('discount')->storedAs('price - 100')->nullable();
});
请注意,Laravel 8.x 支持 SQLite 的计算列。
这里的好处是,在我们的迁移中创建计算列真的很容易。这也意味着我们可以轻松地将这些附加到我们的模型中,而无需将计算属性添加到模型本身。
此外,重要的是我们可以索引计算列。因此,它也可以提高性能。
总结
在某些情况下,使用生成的列是一种很好的方法。如果你想使用虚拟或存储方式,这取决于你和你的情况,但它们都提供了很好的功能,并且有可能使框架本身的代码更小更清晰