Laravel中get...Attribute返回对象行为不一致问题求助
Laravel 自定义模型实例与数据库实例行为不一致问题解决
差异产生的原因
- 从数据库加载的
Brettsperrholz实例是Eloquent自动映射的,decklagen_fk是数据库表的外键字段,存储的就是原始ID数值。哪怕你用$with预加载了decklage关联,这个外键属性依然保持数据库里的原始值,不会被关联对象替换。 - 你手动创建自定义实例时,错误地把
component_a_cover_layer这个关联对象直接赋值给了decklagen_fk属性,相当于把外键字段当成了关联关系的容器,自然和数据库实例的行为完全不一样。
统一行为的具体方案
方案1:让自定义实例的外键字段也存ID
创建自定义实例时,不要直接塞关联对象,而是取关联对象的ID赋值给外键字段,同时如果需要用到关联关系,手动设置:
// 自定义创建Brettsperrholz实例的代码 $brett = new Brettsperrholz(); // 给外键字段赋值ID $brett->decklagen_fk = $this->component_a_cover_layer->id; // 手动设置关联关系,确保后续能正常访问$brett->decklage $brett->setRelation('decklage', $this->component_a_cover_layer);
这样不管是数据库加载还是自定义创建的实例,decklagen_fk都是纯ID数值,后续判断时直接用$model->decklagen_fk对比即可。
方案2:统一通过关联关系获取ID(推荐)
不管实例是从数据库来还是手动创建的,都通过decklage关联属性来获取ID,彻底避开直接操作外键字段:
- 数据库加载的实例:因为
$with预加载了关联,直接用$model->decklage->id就能拿到ID。 - 自定义创建的实例:像方案1那样用
setRelation把关联对象绑定到实例上,之后也能通过$model->decklage->id获取ID。
这种方式更符合Laravel Eloquent的设计逻辑,关联关系就是用来处理这种关联数据的,直接操作外键属于底层操作,容易出现类似你现在的不一致问题,代码也更难维护。
内容的提问来源于stack exchange,提问作者dns_nx
相关产品推荐
相关产品推荐

