I have a before insert and before update trigger with helpers and helper for these helpers. In both helpers I get the 'Too many SOQL queries: 101' error because of queries in loops. How do I get SOQLs out of the loop correctly?
P.S. I use the BurgerHelper
class in 2 helpers but show just one of them for example.
Trigger:
trigger BurgerTrigger on Burger__c (before insert, before update) {
SpecialBurgerHelper specialBurgerHelper = new SpecialBurgerHelper();
if(Trigger.isBefore && Trigger.isInsert) {
specialBurgerHelper.burgerSetup(Trigger.new);
}
if(Trigger.isBefore && Trigger.isUpdate) {
specialBurgerHelper.burgerSetup(Trigger.new);
}
}
Trigger Helper:
public class SpecialBurgerHelper{
public void burgerSetup(List<Burger__c> newBurgers){
BurgerHelper burgerHelper = new BurgerHelper();
for(Burger__c burger : newBurgers){
//end here I get the 'Too many SOQL queries: 101' error:
burger.EditablePrice__c = burgerHelper.getPrice(burger);
}
}
}
Helper of Trigger Helper:
public class BurgerHelper {
public Decimal getPrice(Burger__c newBurger){
Decimal price = newBurger.EditablePrice__c;
if(newBurger.Opportunity__c != null && newBurger.CreatedDate >= Date.TODAY()-5){
oppIds.add(newBurger.Opportunity__c);
}
if(newBurger.FoodOrder__c != null && newBurger.CreatedDate >= Date.TODAY()-5){
//1st query:
FoodOrder__c foodOrder = [SELECT Id, Opportunity__c FROM FoodOrder__c WHERE Id =: newBurger.FoodOrder__c];
oppIds.add(foodOrder.Opportunity__c);
}
//2nd query:
Map<Id,Opportunity> helpMapForOpps = new Map<Id,Opportunity>([SELECT Id, SpecialID__c FROM Opportunity WHERE Id IN : oppIds]);
if(newBurger.EditablePrice__c == null && helpMapForOpps.get(newBurger.Opportunity__c).SpecialID__c == '44445'){
price = 25;
} else{
price = 45;
}
return price;
}
}
getPrice
method to accept List<Burger__c> and return collection.