gpt4 book ai didi

php - Laravel 虚拟列无法保存

转载 作者:行者123 更新时间:2023-11-29 02:41:20 25 4
gpt4 key购买 nike

我使用 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 停止尝试保存虚拟列?

最佳答案

这是我为解决您的问题而写的一个快速特征,它将在保存之前过滤驻留在 $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'];
}

关于php - Laravel 虚拟列无法保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51389454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com