From 5ac34381a8adc997285e3a659e081b0550ad7ccb Mon Sep 17 00:00:00 2001 From: Ramon Diaz Date: Thu, 17 Apr 2025 13:10:43 -0700 Subject: [PATCH 1/2] Add support for saving pivot data directly via widgets --- src/Database/Relations/BelongsToMany.php | 40 +++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/Database/Relations/BelongsToMany.php b/src/Database/Relations/BelongsToMany.php index d820fa763..288b65a58 100644 --- a/src/Database/Relations/BelongsToMany.php +++ b/src/Database/Relations/BelongsToMany.php @@ -65,15 +65,27 @@ public function setSimpleValue($value): void return; } - // Convert models to keys + // Convert models to keys and check if pivot data exists if ($value instanceof Model) { - $value = $value->getKey(); + if ($value->pivot instanceof Pivot) { + $value = [$value->getKey() => $value->pivot->toArray()]; + } else { + $value = $value->getKey(); + } } elseif (is_array($value)) { + $newValue = []; foreach ($value as $_key => $_value) { if ($_value instanceof Model) { - $value[$_key] = $_value->getKey(); + if ($_value->pivot instanceof Pivot) { + $newValue[$_value->getKey()] = $_value->pivot->toArray(); + } else { + $newValue[$_key] = $_value->getKey(); + } } } + if (count($newValue) > 0) { + $value = $newValue; + } } // Convert scalar to array @@ -81,10 +93,30 @@ public function setSimpleValue($value): void $value = [$value]; } + //Check if value has nested arrays (pivot data) + $keys = $value; + $hasPivot = false; + foreach ($value as $_key => $_value) { + if (is_array($_value)) { + $keys[$_key] = $_key; + $hasPivot = true; + } + } + // Setting the relationship $relationCollection = $value instanceof Collection ? $value - : $relationModel->whereIn($relationModel->getKeyName(), $value)->get(); + : $relationModel->whereIn($relationModel->getKeyName(), $keys)->get(); + + + // Associate in memory immediately with pivot data (pivot of relation needs to use Winter\Storm\Database\Pivot) + if ($hasPivot) { + foreach ($relationCollection as $_relationModel) { + if (isset($value[$_relationModel->id])) { + $_relationModel->setRelation('pivot', $this->newPivot($value[$_relationModel->id])); + } + } + } // Associate in memory immediately $this->parent->setRelation($this->relationName, $relationCollection); From 6284b3e4eb88c6c779526c80bb0f0d2eab373ad5 Mon Sep 17 00:00:00 2001 From: Ramon Diaz Date: Tue, 22 Apr 2025 21:01:16 -0700 Subject: [PATCH 2/2] Fixed the hardcoded pivot name and relation primary key name --- src/Database/Relations/BelongsToMany.php | 32 +++++++++++++----------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/Database/Relations/BelongsToMany.php b/src/Database/Relations/BelongsToMany.php index 288b65a58..c4a596301 100644 --- a/src/Database/Relations/BelongsToMany.php +++ b/src/Database/Relations/BelongsToMany.php @@ -65,10 +65,10 @@ public function setSimpleValue($value): void return; } - // Convert models to keys and check if pivot data exists + // if pivot data doesn't exists, Convert models to keys , else convert models to nested arrays with the keys as the indexes (pivot of relation needs to use Winter\Storm\Database\Pivot) if ($value instanceof Model) { - if ($value->pivot instanceof Pivot) { - $value = [$value->getKey() => $value->pivot->toArray()]; + if ($value->{$this->getPivotAccessor()} instanceof Pivot) { + $value = [$value->getKey() => $value->{$this->getPivotAccessor()}->toArray()]; } else { $value = $value->getKey(); } @@ -76,10 +76,10 @@ public function setSimpleValue($value): void $newValue = []; foreach ($value as $_key => $_value) { if ($_value instanceof Model) { - if ($_value->pivot instanceof Pivot) { - $newValue[$_value->getKey()] = $_value->pivot->toArray(); + if ($_value->{$this->getPivotAccessor()} instanceof Pivot) { + $newValue[$_value->getKey()] = $_value->{$this->getPivotAccessor()}->toArray(); } else { - $newValue[$_key] = $_value->getKey(); + $newValue[] = $_value->getKey(); } } } @@ -93,15 +93,19 @@ public function setSimpleValue($value): void $value = [$value]; } - //Check if value has nested arrays (pivot data) - $keys = $value; - $hasPivot = false; + //checks if $value has nested arrays(pivot data) and regenerates the keys in a basic array format + $keys = []; foreach ($value as $_key => $_value) { if (is_array($_value)) { - $keys[$_key] = $_key; - $hasPivot = true; + $keys[] = $_key; } } + if (count($keys) < 1) { + $keys = $value; + $hasPivot = false; + } else { + $hasPivot = true; + } // Setting the relationship $relationCollection = $value instanceof Collection @@ -109,11 +113,11 @@ public function setSimpleValue($value): void : $relationModel->whereIn($relationModel->getKeyName(), $keys)->get(); - // Associate in memory immediately with pivot data (pivot of relation needs to use Winter\Storm\Database\Pivot) + // If avaliable, associate the pivot relation(s) in memory immediately (pivot of relation needs to use Winter\Storm\Database\Pivot) if ($hasPivot) { foreach ($relationCollection as $_relationModel) { - if (isset($value[$_relationModel->id])) { - $_relationModel->setRelation('pivot', $this->newPivot($value[$_relationModel->id])); + if (isset($value[$_relationModel->getKey()])) { + $_relationModel->setRelation($this->getPivotAccessor(), $this->newPivot($value[$_relationModel->getKey()])); } } }