From 6ebb7cfd4a6ad82265e4bb2f64619909cd3e850b Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Mon, 9 Oct 2023 08:35:29 +0000
Subject: [PATCH] fixes #3282

Closes #3282

Merge request studip/studip!2217
---
 .../5.1.51_cleanup_resource_properties.php    | 22 +++++++++++++++++++
 .../ResourcePropertyDefinition.class.php      |  7 ++++++
 2 files changed, 29 insertions(+)
 create mode 100644 db/migrations/5.1.51_cleanup_resource_properties.php

diff --git a/db/migrations/5.1.51_cleanup_resource_properties.php b/db/migrations/5.1.51_cleanup_resource_properties.php
new file mode 100644
index 00000000000..ac8042533b5
--- /dev/null
+++ b/db/migrations/5.1.51_cleanup_resource_properties.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * @see https://gitlab.studip.de/studip/studip/-/issues/3282
+ */
+final class CleanupResourceProperties extends Migration
+{
+    public function description()
+    {
+        return 'Removes orphaned rows from table "resource_properties" with no '
+             . 'definition in table "resource_property_definitions"';
+    }
+
+    protected function up()
+    {
+        $query = "DELETE FROM `resource_properties`
+                  WHERE `property_id` NOT IN (
+                      SELECT `property_id`
+                      FROM `resource_property_definitions`
+                  )";
+        DBManager::get()->exec($query);
+    }
+}
diff --git a/lib/models/resources/ResourcePropertyDefinition.class.php b/lib/models/resources/ResourcePropertyDefinition.class.php
index e72717f6dd8..3525e413bde 100644
--- a/lib/models/resources/ResourcePropertyDefinition.class.php
+++ b/lib/models/resources/ResourcePropertyDefinition.class.php
@@ -55,6 +55,13 @@ class ResourcePropertyDefinition extends SimpleORMap
             'class_name' => ResourcePropertyGroup::class,
             'foreign_key' => 'property_group_id'
         ];
+
+        $config['has_many']['properties'] = [
+            'class_name'        => ResourceProperty::class,
+            'assoc_foreign_key' => 'property_id',
+            'on_delete'         => 'delete',
+        ];
+
         $config['i18n_fields']['display_name'] = true;
         $config['i18n_fields']['description'] = true;
 
-- 
GitLab