MDL-63973 core_badges: related badges query now works both ways
authorJake Dallimore <jake@moodle.com>
Thu, 15 Nov 2018 07:54:54 +0000 (15:54 +0800)
committerJake Dallimore <jake@moodle.com>
Mon, 19 Nov 2018 03:08:00 +0000 (11:08 +0800)
If A is related to B, then we should be able to view this relationship
from both badge A and badge B. The following badge methods were updated:
- get_related_badges()
- has_related()
- delete_related_badge()

lib/badgeslib.php

index 544b37f..d0c1931 100644 (file)
@@ -761,7 +761,10 @@ class badge {
      */
     public function delete_related_badge($relatedid) {
         global $DB;
      */
     public function delete_related_badge($relatedid) {
         global $DB;
-        return $DB->delete_records('badge_related', array('badgeid' => $this->id, 'relatedbadgeid' => $relatedid));
+        $sql = "(badgeid = :badgeid AND relatedbadgeid = :relatedid) OR " .
+               "(badgeid = :relatedid2 AND relatedbadgeid = :badgeid2)";
+        $params = ['badgeid' => $this->id, 'badgeid2' => $this->id, 'relatedid' => $relatedid, 'relatedid2' => $relatedid];
+        return $DB->delete_records_select('badge_related', $sql, $params);
     }
 
     /**
     }
 
     /**
@@ -771,7 +774,11 @@ class badge {
      */
     public function has_related() {
         global $DB;
      */
     public function has_related() {
         global $DB;
-        return $DB->record_exists('badge_related', array('badgeid' => $this->id));
+        $sql = "SELECT DISTINCT b.id
+                    FROM {badge_related} br
+                    JOIN {badge} b ON (br.relatedbadgeid = b.id OR br.badgeid = b.id)
+                   WHERE (br.badgeid = :badgeid OR br.relatedbadgeid = :badgeid2) AND b.id != :badgeid3";
+        return $DB->record_exists_sql($sql, ['badgeid' => $this->id, 'badgeid2' => $this->id, 'badgeid3' => $this->id]);
     }
 
     /**
     }
 
     /**
@@ -783,11 +790,11 @@ class badge {
     public function get_related_badges(bool $activeonly = false) {
         global $DB;
 
     public function get_related_badges(bool $activeonly = false) {
         global $DB;
 
-        $params = array('badgeid' => $this->id);
-        $query = "SELECT b.id, b.name, b.version, b.language, b.type
+        $params = array('badgeid' => $this->id, 'badgeid2' => $this->id, 'badgeid3' => $this->id);
+        $query = "SELECT DISTINCT b.id, b.name, b.version, b.language, b.type
                     FROM {badge_related} br
                     FROM {badge_related} br
-                    JOIN {badge} b ON b.id = br.relatedbadgeid
-                   WHERE br.badgeid = :badgeid";
+                    JOIN {badge} b ON (br.relatedbadgeid = b.id OR br.badgeid = b.id)
+                   WHERE (br.badgeid = :badgeid OR br.relatedbadgeid = :badgeid2) AND b.id != :badgeid3";
         if ($activeonly) {
             $query .= " AND b.status <> :status";
             $params['status'] = BADGE_STATUS_INACTIVE;
         if ($activeonly) {
             $query .= " AND b.status <> :status";
             $params['status'] = BADGE_STATUS_INACTIVE;