diff --git a/src/Database/Concerns/HasReplication.php b/src/Database/Concerns/HasReplication.php index 80dbdc4bd..6a3d1bcf6 100644 --- a/src/Database/Concerns/HasReplication.php +++ b/src/Database/Concerns/HasReplication.php @@ -4,6 +4,9 @@ /** * HasReplication for a model + * + * @package october\database + * @author Alexey Bobkov, Samuel Georges */ trait HasReplication { diff --git a/src/Database/Models/DeferredBinding.php b/src/Database/Models/DeferredBinding.php index 30cedbfa8..1fbc2500b 100644 --- a/src/Database/Models/DeferredBinding.php +++ b/src/Database/Models/DeferredBinding.php @@ -59,7 +59,7 @@ public function beforeCreate() * getPivotDataForBind strips attributes beginning with an underscore, allowing * meta data to be stored using the column alongside the data. */ - public function getPivotDataForBind(): array + public function getPivotDataForBind($model, $relationName): array { $data = []; @@ -70,6 +70,15 @@ public function getPivotDataForBind(): array $data[$key] = $value; } + + if ( + $model->isClassInstanceOf(\October\Contracts\Database\SortableRelationInterface::class) && + $model->isSortableRelation($relationName) + ) { + $sortColumn = $model->getRelationSortOrderColumn($relationName); + $data[$sortColumn] = $this->sort_order; + } + return $data; } diff --git a/src/Database/Relations/BelongsToMany.php b/src/Database/Relations/BelongsToMany.php index b63512829..6309dcf43 100644 --- a/src/Database/Relations/BelongsToMany.php +++ b/src/Database/Relations/BelongsToMany.php @@ -459,12 +459,10 @@ protected function performLeftJoin($query = null) { $query = $query ?: $this->query; - $query->leftJoin( - $this->table, - $this->getQualifiedRelatedKeyName(), - '=', - $this->getQualifiedRelatedPivotKeyName() - ); + $query->leftJoin($this->table, function($join) { + $join->on($this->getQualifiedRelatedKeyName(), '=', $this->getQualifiedRelatedPivotKeyName()); + $join->where($this->getQualifiedForeignPivotKeyName(), $this->parent->getKey()); + }); return $this; } @@ -489,8 +487,6 @@ protected function performSortableColumnJoin($query = null, $sessionKey = null) $orderDefinitions = $query->getQuery()->orders; - traceLog($orderDefinitions); - if (!is_array($orderDefinitions)) { return; } diff --git a/src/Database/Traits/DeferredBinding.php b/src/Database/Traits/DeferredBinding.php index 3af09366b..3c94e0a92 100644 --- a/src/Database/Traits/DeferredBinding.php +++ b/src/Database/Traits/DeferredBinding.php @@ -3,7 +3,7 @@ use October\Rain\Database\Models\DeferredBinding as DeferredBindingModel; /** - * DeferredBinding trait + * DeferredBinding trait is implemented by all models * * @package october\database * @author Alexey Bobkov, Samuel Georges @@ -196,7 +196,8 @@ protected function commitDeferredOfType($sessionKey, $include = null, $exclude = $relationObj = $this->$relationName(); if ($binding->is_bind) { if (in_array($relationType, ['belongsToMany', 'morphToMany', 'morphedByMany'])) { - $relationObj->add($slaveModel, null, $binding->getPivotDataForBind()); + $pivotData = $binding->getPivotDataForBind($this, $relationName); + $relationObj->add($slaveModel, null, $pivotData); } else { $relationObj->add($slaveModel); diff --git a/src/Database/Traits/SortableRelation.php b/src/Database/Traits/SortableRelation.php index 9b470f8e2..b27195301 100644 --- a/src/Database/Traits/SortableRelation.php +++ b/src/Database/Traits/SortableRelation.php @@ -42,12 +42,15 @@ public function initializeSortableRelation() return; } - $relation = $this->$relationName(); - + // Order already set in pivot data (assuming singular) $column = $this->getRelationSortOrderColumn($relationName); + if (is_array($data) && array_key_exists($column, $data)) { + return; + } + // Calculate a new order + $relation = $this->$relationName(); $order = $relation->max($relation->qualifyPivotColumn($column)); - foreach ((array) $attached as $id) { $relation->updateExistingPivot($id, [$column => ++$order]); }