Apex Trigger中如何关联查询更新父对象Truck__c的字段
报错原因及修复方案
直接修复当前SOQL报错
你的SOQL语法错误核心是:Booking__c上关联主对象Truck__c的字段Truck__c本身就是Truck记录的Id值,不需要额外加.id后缀,修改为以下写法即可解决报错:
Truck__c truckObj = [Select Id, Price__c from Truck__c where Id = :objBooking.Truck__c LIMIT 1];
注意必须加LIMIT 1,避免查询返回多条记录抛出运行时异常。
更合规的批量优化写法
你当前把SOQL写在循环内的写法违反Salesforce Governor Limit规则,数据量较大时会触发SOQL次数上限报错,建议直接在查询Booking__c时关联带出Truck__c的字段,不需要单独查询Truck对象:
- 首先修改Booking__c的查询语句,通过关系字段
Truck__r直接查询关联的Truck字段:
List<Booking__c> bookingList = [SELECT Id, Truck__r.Id, Truck__r.Price__c FROM Booking__c WHERE Id IN :relatedBookingIdSet];
- 后续直接通过
objBooking.Truck__r.Price__c即可拿到对应卡车的价格,无需额外发起SOQL查询。
现有触发器其他逻辑问题补充
你当前的代码还存在多处逻辑错误,建议同步修正:
- 触发器仅声明了
after insert触发事件,但判断条件包含Trigger.isUpdate,导致Payment更新时逻辑不会执行,修改触发器声明为:trigger TestTrigger on Payment__c (after insert, after update) - 查询Booking__c时过滤条件错误:你用
Booking_ID__c in:payId过滤,实际Payment上关联Booking的查找字段应为Booking__c,需要按Payment记录的Booking__c字段值过滤Booking记录 - 循环内单独执行
update truckObj会触发DML次数限制,建议把需要更新的Truck记录放到List中,最后统一执行批量DML
内容的提问来源于stack exchange,提问作者unflagged.destination
相关产品推荐
相关产品推荐

