Circular M:M relationship adds duplicate rows to the linking table

I'm trying to add a circular (relationship with itself) M:M relationship to the Product Templates module. I was to create it and the subsequent linking table and add the subpanels for both the left and right side of the relationship.

However, when I try to add/link/unlink records to any of the two subpanels, it is duplicated to the other. I checked the linking table, and 2 rows were added.

This is the vardefs for the relationship:

<?php

$dictionary["ProductTemplate"]["fields"]["producttemplates_producttemplates_1_left"] = array (
  'name' => 'producttemplates_producttemplates_1_left',
  'type' => 'link',
  'relationship' => 'producttemplates_producttemplates_1',
  'source' => 'non-db',
  'module' => 'ProductTemplates',
  'bean_name' => 'ProductTemplate',
  'vname' => 'LBL_PRODUCTTEMPLATES_PRODUCTTEMPLATES_1_FROM_PRODUCTTEMPLATES_L_TITLE',
  'id_name' => 'child_product_id',
  'link-type' => 'many',
  'side' => 'left',
);
$dictionary["ProductTemplate"]["fields"]["producttemplates_producttemplates_1_right"] = array (
  'name' => 'producttemplates_producttemplates_1_right',
  'type' => 'link',
  'relationship' => 'producttemplates_producttemplates_1',
  'source' => 'non-db',
  'module' => 'ProductTemplates',
  'bean_name' => 'ProductTemplate',
  'side' => 'right',
  'vname' => 'LBL_PRODUCTTEMPLATES_PRODUCTTEMPLATES_1_FROM_PRODUCTTEMPLATES_R_TITLE',
  'id_name' => 'parent_product_id',
  'link-type' => 'many',
);


This is the metadata for the relationship:

<?php
// created: 2020-07-28 19:01:14
$dictionary["producttemplates_producttemplates_1"] = array (
  'true_relationship_type' => 'many-to-many',
  'from_studio' => true,
  'relationships' => 
  array (
    'producttemplates_producttemplates_1' => 
    array (
      'lhs_module' => 'ProductTemplates',
      'lhs_table' => 'product_templates',
      'lhs_key' => 'id',
      'rhs_module' => 'ProductTemplates',
      'rhs_table' => 'product_templates',
      'rhs_key' => 'id',
      'relationship_type' => 'many-to-many',
      'join_table' => 'product_templates_product_templates_1_c',
      'join_key_lhs' => 'parent_product_id',
      'join_key_rhs' => 'child_product_id',
    ),
  ),
  'table' => 'product_templates_product_templates_1_c',
  'fields' => 
  array (
    'id' => 
    array (
      'name' => 'id',
      'type' => 'id',
    ),
    'date_modified' => 
    array (
      'name' => 'date_modified',
      'type' => 'datetime',
    ),
    'deleted' => 
    array (
      'name' => 'deleted',
      'type' => 'bool',
      'default' => 0,
    ),
    'parent_product_id' => 
    array (
      'name' => 'parent_product_id',
      'type' => 'id',
    ),
    'child_product_id' => 
    array (
      'name' => 'child_product_id',
      'type' => 'id',
    ),
  ),
  'indices' => 
  array (
    0 => 
    array (
      'name' => 'idx_product_templates_product_templates_1_pk',
      'type' => 'primary',
      'fields' => 
      array (
        0 => 'id',
      ),
    ),
    1 => 
    array (
      'name' => 'idx_parent_product_id1_deleted',
      'type' => 'index',
      'fields' => 
      array (
        0 => 'parent_product_id',
        1 => 'deleted',
      ),
    ),
    2 => 
    array (
      'name' => 'idx_child_product_id2_deleted',
      'type' => 'index',
      'fields' => 
      array (
        0 => 'child_product_id',
        1 => 'deleted',
      ),
    ),
    3 => 
    array (
      'name' => 'product_templates_product_templates_1_alt',
      'type' => 'alternate_key',
      'fields' => 
      array (
        0 => 'child_product_id',
      ),
    ),
  ),
);

How can I make it so that, there should be no duplicates when I add/link a record to any of the subpanels?

EDIT:

After some digging in the Sugar Core files, I found out that when the you have a self referencing relationship (when LHS module = RHS module), it will do another addRow to the table. (M2MRelationship.php, line 142). This must be the one that's causing the additional row, but since this is a parent-child relationship, I would not need this.

<?php
class M2MRelationship extends SugarRelationship {
...
//Many to many has no additional logic, so just add a new row to the table and notify the beans.
$dataToInsert = $this->getRowToInsert($lhs, $rhs, $additionalFields);
/**
 * We need to do a complete check against all fields in the relationship to ensure that
 * an update occurs for any additional relationship fields
 * */
if (!$currentRow || !$this->compareRow($currentRow, $dataToInsert)) {
    $this->addRow($dataToInsert);

    if ($this->self_referencing) {
        $this->addSelfReferencing($lhs, $rhs, $additionalFields); <---- This adds the additional row
    }
    ...
}

Any help is appreciated. Thanks!

Parents Reply Children