Only fetch the rows when needed
authorMichael <heluecht@pirati.ca>
Mon, 1 May 2017 05:45:36 +0000 (05:45 +0000)
committerMichael <heluecht@pirati.ca>
Mon, 1 May 2017 05:45:36 +0000 (05:45 +0000)
include/dba.php

index b0d05f4..b2ed96e 100644 (file)
@@ -812,23 +812,37 @@ class dba {
                // Is there a relation entry for the table?
                if (isset(self::$relation[$table])) {
                        foreach (self::$relation[$table] AS $field => $rel_def) {
-                               // Fetch all rows that are to be deleted
-                               $sql = "SELECT ".self::$dbo->escape($field)." FROM `".$table."` WHERE `".
-                                       implode("` = ? AND `", array_keys($param))."` = ?";
+                               // Currently we only support relations with a single variable
+                               if (count($rel_def) > 1) {
+                                       return false;
+                               }
 
-                               $retval = false;
-                               $data = self::p($sql, $param);
-                               while ($row = self::fetch($data)) {
-                                       foreach ($rel_def AS $rel_table => $rel_field) {
-                                               // We do a separate delete process per row
+                               $rel_field = array_values($rel_def)[0];
+                               $rel_table = array_keys($rel_def)[0];
+
+                               // When the search field is the relation field, we don't need to fetch the rows
+                               // This is useful when the leading record is already deleted in the frontend but the rest is done in the backend
+                               if ((count($param) == 1) AND ($field == array_keys($param)[0])) {
+                                       $retval = self::delete($rel_table, array($rel_field => array_values($param)[0]), true, $callstack);
+                                       if (!$retval) {
+                                               return false;
+                                       }
+                               } else {
+                                       // Fetch all rows that are to be deleted
+                                       $sql = "SELECT ".self::$dbo->escape($field)." FROM `".$table."` WHERE `".
+                                       implode("` = ? AND `", array_keys($param))."` = ?";
+                                       $retval = false;
+                                       $data = self::p($sql, $param);
+                                       while ($row = self::fetch($data)) {
+                                               // We have to do a separate delete process per row
                                                $retval = self::delete($rel_table, array($rel_field => $row[$field]), true, $callstack);
                                                if (!$retval) {
                                                        return false;
                                                }
                                        }
-                               }
-                               if (!$retval) {
-                                       return true;
+                                       if (!$retval) {
+                                               return true;
+                                       }
                                }
                        }
                }