diff --git a/application/models/Survey.php b/application/models/Survey.php index a19bb04704d..ff546d19019 100755 --- a/application/models/Survey.php +++ b/application/models/Survey.php @@ -1612,7 +1612,23 @@ public function search() // Survey group filter if (isset($this->gsid)) { - $criteria->compare("t.gsid", $this->gsid, false); + // The survey group filter (from the dropdown, not by title search) is applied to five levels of survey groups. + // That is, it matches the group the survey is in, the parent group of that group, and the "grandparent" group, etc. + $groupJoins = 'LEFT JOIN {{surveys_groups}} parentGroup1 ON t.gsid = parentGroup1.gsid '; + $groupJoins .= 'LEFT JOIN {{surveys_groups}} parentGroup2 ON parentGroup1.parent_id = parentGroup2.gsid '; + $groupJoins .= 'LEFT JOIN {{surveys_groups}} parentGroup3 ON parentGroup2.parent_id = parentGroup3.gsid '; + $groupJoins .= 'LEFT JOIN {{surveys_groups}} parentGroup4 ON parentGroup3.parent_id = parentGroup4.gsid '; + $groupJoins .= 'LEFT JOIN {{surveys_groups}} parentGroup5 ON parentGroup4.parent_id = parentGroup5.gsid '; + $criteria->mergeWith([ + 'join' => $groupJoins, + ]); + $groupCondition = "t.gsid=:gsid"; + $groupCondition .= " OR parentGroup2.gsid=:gsid"; + $groupCondition .= " OR parentGroup3.gsid=:gsid"; + $groupCondition .= " OR parentGroup4.gsid=:gsid"; + $groupCondition .= " OR parentGroup5.gsid=:gsid"; + $criteria->addCondition($groupCondition, 'AND'); + $criteria->params = array_merge($criteria->params, [':gsid' => $this->gsid]); } // Active filter