2020use Tempest \Database \QueryStatements \OrderByStatement ;
2121use Tempest \Database \QueryStatements \RawStatement ;
2222use Tempest \Database \QueryStatements \SelectStatement ;
23+ use Tempest \Database \Relation ;
2324use Tempest \Support \Arr \ImmutableArray ;
2425use Tempest \Support \Conditions \HasConditions ;
2526use Tempest \Support \Paginator \PaginatedData ;
3334 * @template TModel of object
3435 * @implements \Tempest\Database\Builder\QueryBuilders\BuildsQuery<TModel>
3536 * @implements \Tempest\Database\Builder\QueryBuilders\SupportsWhereStatements<TModel>
37+ * @implements \Tempest\Database\Builder\QueryBuilders\SupportsJoins<TModel>
38+ * @implements \Tempest\Database\Builder\QueryBuilders\SupportsRelations<TModel>
3639 * @use \Tempest\Database\Builder\QueryBuilders\HasWhereQueryBuilderMethods<TModel>
3740 */
38- final class SelectQueryBuilder implements BuildsQuery, SupportsWhereStatements
41+ final class SelectQueryBuilder implements BuildsQuery, SupportsWhereStatements, SupportsJoins, SupportsRelations
3942{
4043 use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TransformsQueryBuilder;
4144
4245 public ModelInspector $ model ;
4346
4447 private SelectStatement $ select ;
4548
46- private array $ joins = [];
49+ public array $ joins = [];
4750
48- private array $ relations = [];
51+ public array $ relations = [];
4952
5053 public array $ bindings = [];
5154
@@ -133,7 +136,7 @@ public function get(PrimaryKey $id): mixed
133136 *
134137 * @template TSourceModel of object
135138 * @param (BuildsQuery<TSourceModel>&SupportsWhereStatements<TSourceModel>) $source
136- * @return UpdateQueryBuilder <TSourceModel>
139+ * @return SelectQueryBuilder <TSourceModel>
137140 */
138141 public static function fromQueryBuilder (BuildsQuery &SupportsWhereStatements $ source , mixed ...$ fields ): SelectQueryBuilder
139142 {
@@ -144,6 +147,16 @@ public static function fromQueryBuilder(BuildsQuery&SupportsWhereStatements $sou
144147 $ builder ->wheres [] = $ where ;
145148 }
146149
150+ if ($ source instanceof SupportsJoins) {
151+ $ builder ->joins = $ source ->joins ;
152+ }
153+
154+ if ($ source instanceof SupportsRelations) {
155+ foreach ($ source ->getResolvedRelations () as $ relation ) {
156+ $ builder ->joins [] = $ relation ->getJoinStatement ();
157+ }
158+ }
159+
147160 return $ builder ;
148161 }
149162
@@ -336,7 +349,7 @@ public function build(mixed ...$bindings): Query
336349 $ select = $ select ->withJoin (new JoinStatement ($ join ));
337350 }
338351
339- foreach ($ this ->getIncludedRelations () as $ relation ) {
352+ foreach ($ this ->getResolvedRelations () as $ relation ) {
340353 $ select = $ select
341354 ->withFields ($ relation ->getSelectFields ())
342355 ->withJoin ($ relation ->getJoinStatement ());
@@ -350,8 +363,12 @@ private function clone(): self
350363 return clone $ this ;
351364 }
352365
353- /** @return \Tempest\Database\Relation[] */
354- private function getIncludedRelations (): array
366+ /**
367+ * Gets all resolved relations with their join statements.
368+ *
369+ * @return Relation[]
370+ */
371+ public function getResolvedRelations (): array
355372 {
356373 $ definition = inspect ($ this ->model ->getName ());
357374
0 commit comments