function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
MokshadaMokshada 

deletion of one record is not deleting other record using trigger

I have Created two Objects say Teacher__c(Parent) and Student__c(Child) having similar fields such as name, email, mobile and Address. and they have two unique fields on both objects such as teacherid__c on teacher object and id__c on student object On deleting record of Teacher__c, associated Student__c record should be deleted and vice versa.
here in my code insertion and updation is working but deletion is not working can anyone help me doing that
code:
trigger TeacherTrigger on Teacher__c (after insert, after update, before delete) {
    if (Trigger.isAfter) {
        if (Trigger.isInsert) {
            List<Student__c> studentsToInsert = new List<Student__c>();
            for (Teacher__c teacher : Trigger.new) {
                if(triggerCount.runonce()){
                    Student__c student = new Student__c();
                    student.Name = teacher.Name;
                    student.Email__c = teacher.Email__c;
                    student.Mobile__c = teacher.Mobile__c;
                    student.Address__c = teacher.Address__c;
                    student.id__c = teacher.Id;
                    studentsToInsert.add(student);
                }
            }
            if (!studentsToInsert.isEmpty()) {
                insert studentsToInsert;
            }
        }
        if (Trigger.isUpdate) {
            List<Student__c> studentsToUpdate = new List<Student__c>();
            for (Teacher__c teacher : Trigger.new) {
                if(triggerCount.runonce()){
                    List<Student__c> existingStudents = [SELECT Id, Name, Email__c, Mobile__c, Address__c, id__c FROM Student__c WHERE id__c = :teacher.Id LIMIT 1];
                    if (!existingStudents.isEmpty()) {
                        Student__c student = existingStudents[0];
                        student.Name = teacher.Name;
                        student.Email__c = teacher.Email__c;
                        student.Mobile__c = teacher.Mobile__c;
                        student.Address__c = teacher.Address__c;
                        studentsToUpdate.add(student);
                    }
                }
            }
            if (!studentsToUpdate.isEmpty()) {
                update studentsToUpdate;
            }
        }
        if (Trigger.isDelete) {
            list<String> teacherIds=new list<String>();
            for(Teacher__c teacher:trigger.old)
            {
                teacherIds.add(teacher.id);
            }
            list<Student__c> listOfStudents=[select id,id__c from Student__c where id__c in:teacherIds];
            System.debug('Number of students found: ' + listOfStudents.size());
            system.debug('listOfstudents'+listOfStudents);
            if (!listOfStudents.isEmpty()) {
                delete listOfStudents;
            }
        }
    }
}


trigger StudentTrigger on Student__c (after insert, after update, before delete) {
    if (Trigger.isAfter) {
        if (Trigger.isInsert) {
            List<Teacher__c> teachersToInsert = new List<Teacher__c>();
            
            for (Student__c student : Trigger.new) {
                if(triggerCount.runonce()){
                    Teacher__c teacher = new Teacher__c();
                    teacher.Name = student.Name;
                    teacher.Email__c = student.Email__c;
                    teacher.Mobile__c = student.Mobile__c;
                    teacher.Address__c = student.Address__c;
                    teacher.teacherid__c = student.Id;
                    teachersToInsert.add(teacher);
                }
            }
            
            if (!teachersToInsert.isEmpty()) {
                insert teachersToInsert;
            }
        }
        
        if (Trigger.isUpdate) {
            List<Teacher__c> teachersToUpdate = new List<Teacher__c>();
            for (Student__c student : Trigger.new) {
                if(triggerCount.runonce()){
                    List<Teacher__c> existingTeachers = [SELECT Id, Name, Email__c, Mobile__c, Address__c, teacherid__c FROM Teacher__c WHERE teacherid__c = :student.id LIMIT 1];
                    if (!existingTeachers.isEmpty()) {
                        Teacher__c teacher = existingTeachers[0];
                        teacher.Name = student.Name;
                        teacher.Email__c = student.Email__c;
                        teacher.Mobile__c = student.Mobile__c;
                        teacher.Address__c = student.Address__c;
                        teachersToUpdate.add(teacher);
                    }
                }
            }
            
            if (!teachersToUpdate.isEmpty()) {
                update teachersToUpdate;
            }
        }
        if (Trigger.isDelete) {
            list<String> studentIds=new list<String>();
            for(Student__c student:trigger.old)
            {
                studentIds.add(student.id);
            }
            list<Teacher__c> listOfTeachers=[select id,teacherid__c from Teacher__c where teacherid__c in:studentIds];
            system.debug('listOfTeachers'+listOfTeachers);
            if (!listOfTeachers.isEmpty()) {
                delete listOfTeachers;
            }
        }
    }
}
Thanks
Shivani Kolhe 11Shivani Kolhe 11
The issue with your deletion logic lies in how you are retrieving the related records and attempting to delete them. In both the `TeacherTrigger` and `StudentTrigger`, you are using the wrong field to match the related records.

Here are the modifications you need to make in order to correctly delete the associated records:

In `TeacherTrigger`:
if (Trigger.isDelete) {
    List<String> teacherIds = new List<String>();
    for (Teacher__c teacher : trigger.old) {
        teacherIds.add(teacher.Id__c); // Use the correct field name 'Id__c' instead of 'id'
    }
    List<Student__c> listOfStudents = [SELECT Id FROM Student__c WHERE TeacherId__c IN :teacherIds]; // Use the correct field name 'TeacherId__c' instead of 'id__c'
    if (!listOfStudents.isEmpty()) {
        delete listOfStudents;
    }
}

In `StudentTrigger`:
if (Trigger.isDelete) {
    List<String> studentIds = new List<String>();
    for (Student__c student : trigger.old) {
        studentIds.add(student.Id__c); // Use the correct field name 'Id__c' instead of 'id'
    }
    List<Teacher__c> listOfTeachers = [SELECT Id FROM Teacher__c WHERE TeacherId__c IN :studentIds]; // Use the correct field name 'TeacherId__c' instead of 'teacherid__c'
    if (!listOfTeachers.isEmpty()) {
        delete listOfTeachers;
    }
}

By making these changes, the deletion logic should work correctly, and associated records will be deleted when a parent record is deleted or vice versa.

Please note that you may need to adjust the field names (such as `Id__c`, `TeacherId__c`, etc.) in the SOQL queries based on the actual field names in your objects. Also, ensure that the triggers are properly assigned to the objects and activated in your Salesforce organization.

Please let me know if this works