Laravel 9 Eloquent模型中attributes列名冲突问题解决求助
解决Eloquent模型内置
attributes与数据库attributes列冲突的方案 由于Eloquent模型内置了$attributes属性数组,与数据库表的attributes列重名时,在模型内部直接访问$this->attributes会优先指向内置数组,而非经过类型转换的数据库列值。以下是两种可行的解决方法:
方法一:使用getAttribute/setAttribute明确操作数据库列
通过模型的getAttribute方法获取经过类型转换的ArrayObject实例,修改后再用setAttribute同步到数据库列:
// 获取数据库中attributes列的转换后值(ArrayObject) $dbAttributes = $this->getAttribute('attributes'); // 修改JSON字段内的属性 $dbAttributes['a_property_of_the_attributes_jsonb_field'] = 'hello world!'; // 将修改后的值同步回数据库列 $this->setAttribute('attributes', $dbAttributes);
方法二:自定义属性别名(更易读)
给模型添加访问器和修改器,将数据库的attributes列映射为一个无冲突的别名(如db_attributes),之后直接通过别名操作即可:
1. 在模型中配置访问器、修改器
use Illuminate\Database\Eloquent\Casts\AsArrayObject; use Illuminate\Database\Eloquent\Model; class MyTable extends Model { protected $casts = [ 'attributes' => AsArrayObject::class, ]; // 访问器:返回数据库attributes列的转换后值 public function getDbAttributesAttribute() { return $this->getAttribute('attributes'); } // 修改器:将别名属性的值同步到数据库attributes列 public function setDbAttributesAttribute($value) { $this->setAttribute('attributes', $value); } }
2. 通过别名操作JSON字段
// 直接修改别名属性内的JSON字段 $this->db_attributes['a_property_of_the_attributes_jsonb_field'] = 'hello world!'; // 保存时自动同步到数据库的attributes列 $this->save();
内容的提问来源于stack exchange,提问作者HarryTuttle
相关产品推荐
相关产品推荐

