laravel虚拟列无法保存

ma8fv8wu  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(322)

我使用laravels向数据库表中添加了几个虚拟列 virtualAs 列修饰符:

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

基本上,它保留了一个mysql虚拟列,根据存储在另一列中的合计和税率自动计算总计。
然而,laravel似乎对虚拟专栏一点也不感兴趣。保存记录时,它会尝试 INSERT 或者 UPDATE 虚拟列,这在mysql中显然是不允许的。在雄辩的模型中,我找不到一种方法来配置哪些字段在更新或插入时实际写入数据库。
我试过在模型中添加字段 $hidden ,和 $appends 但似乎什么都不管用。
查看laravel源代码以获取插入(https://github.com/laravel/framework/blob/5.6/src/illuminate/database/eloquent/model.php#l733),它似乎只是插入了 $this->attributes . 从数据库中读取记录时 grand_total 字段从表中读取并设置为属性,然后在保存记录后再次尝试写入。
有没有办法让这个laravel停止尝试保存虚拟列?

9wbgstp7

9wbgstp71#

下面是我为解决您的问题而编写的一个快速特性,它将在保存之前过滤驻留在$virtualfields属性中的字段。它需要在保存后选择(刷新)以获取虚拟字段的新值。如果您不需要查询这个虚拟字段,我强烈建议您研究一个变种。

trait HasVirtualFields 
{
     public function save(array $options = [])
     {
          if (isset($this->virtualFields)) {
              $this->attributes = array_diff_key($this->attributes, array_flip($this->virtualFields));
          }

          $return = parent::save($options);
          $this->refresh(); // Refresh the model for the new virtual column values
          return $return;
    }
}

class YourModel
{
    use HasVirtualFields;
    protected $virtualFields = ['grand_total'];
}

相关问题