diff --git a/modules/backend/formwidgets/Relation.php b/modules/backend/formwidgets/Relation.php index 0c5697af8..e6ffdad51 100644 --- a/modules/backend/formwidgets/Relation.php +++ b/modules/backend/formwidgets/Relation.php @@ -1,11 +1,11 @@ config->select)) { + $this->sqlSelect = $this->config->select; + } } /** @@ -118,28 +121,26 @@ class Relation extends FormWidgetBase // by joining its pivot table. Remove all joins from the query. $query->getQuery()->getQuery()->joins = []; - /** - * The nameFromSelect config takes precedence over nameFrom. - * A virtual column called "selection" will contain the result. - */ - if ($this->nameFromSelect) { + // Determine if the model uses a tree trait + $treeTraits = ['October\Rain\Database\Traits\NestedTree', 'October\Rain\Database\Traits\SimpleTree']; + $usesTree = count(array_intersect($treeTraits, class_uses($relationModel))) > 0; + + // The "sqlSelect" config takes precedence over "nameFrom". + // A virtual column called "selection" will contain the result. + // Tree models must select all columns to return parent columns, etc. + if ($this->sqlSelect) { $nameFrom = 'selection'; - $query = $query->select( - DB::raw($this->nameFromSelect . ' AS ' . $nameFrom), - $relationModel->getKeyName() - ); + $selectColumn = $usesTree ? '*' : $relationModel->getKeyName(); + $result = $query->select($selectColumn, Db::raw($this->sqlSelect . ' AS ' . $nameFrom)); } else { $nameFrom = $this->nameFrom; + $result = $query->getQuery()->get(); } - $treeTraits = ['October\Rain\Database\Traits\NestedTree', 'October\Rain\Database\Traits\SimpleTree']; - if (count(array_intersect($treeTraits, class_uses($relationModel))) > 0) { - $field->options = $query->listsNested($nameFrom, $relationModel->getKeyName()); - } - else { - $field->options = $query->lists($nameFrom, $relationModel->getKeyName()); - } + $field->options = $usesTree + ? $result->listsNested($nameFrom, $relationModel->getKeyName()) + : $result->lists($nameFrom, $relationModel->getKeyName()); return $field; });