Laravel虚拟列无法保存

时间:2018-07-17 20:10:02

标签: php mysql laravel

我使用Laravels virtualAs列修饰符在数据库表中添加了两个虚拟列:

 $table->decimal('grand_total')->virtualAs( '(total_value + (total_value*tax_rate))');

基本上,它保留一个mysql虚拟列,该列根据存储在另一列中的总计和税率自动计算总计。

但是,Laravel似乎在虚拟列上根本玩不好。保存记录时,它将尝试INSERTUPDATE虚拟列,这在mySQL中显然是不允许的。我找不到在Eloquent模型中配置在更新或插入时实际上将哪些字段写入数据库的方法。

我尝试将字段添加到模型$hidden$appends中,但似乎无济于事。

查看Laravel源代码中的插入(https://github.com/laravel/framework/blob/5.6/src/Illuminate/Database/Eloquent/Model.php#L733),似乎只是插入$this->attributes中的任何属性。从数据库中读取记录时,将从表中读取grand_total字段并将其设置为属性,然后在记录保存后尝试再次写入。

有什么方法可以使Laravel停止尝试保存虚拟列吗?

1 个答案:

答案 0 :(得分:1)

这是我为解决您的问题而写的一个快速特征,该问题将在保存之前过滤驻留在$ virtualFields属性中的字段。保存后需要选择(刷新)以获取虚拟字段的新值。如果您不需要查询此虚拟字段,则强烈建议您改用mutator。

Declare @Newstring varchar(20) = 'sample'
declare @query varchar(max)
IF 1=1
    BEGIN
      set @query = '
           select e.id, c.address,
                  case when a.lastname is null then a.firstname
                       else a.lastname + ''' + @Newstring + '''  --added quotes to make the string a literal during execution
                  end name' ---quote added here

     END   --added END here


print @query