|
24 | 24 |
|
25 | 25 | from ..pagination import LengthAwarePaginator, SimplePaginator
|
26 | 26 |
|
| 27 | +from .EagerRelation import EagerRelations |
| 28 | + |
27 | 29 |
|
28 | 30 | class QueryBuilder(ObservesEvents):
|
29 | 31 | """A builder class to manage the building and creation of query expressions."""
|
@@ -56,7 +58,7 @@ def __init__(
|
56 | 58 | self._connection_details = connection_details
|
57 | 59 | self._connection_driver = connection_driver
|
58 | 60 | self._scopes = scopes
|
59 |
| - self._eager_loads = () |
| 61 | + self._eager_relation = EagerRelations() |
60 | 62 | if model:
|
61 | 63 | self._global_scopes = model._global_scopes
|
62 | 64 | if model.__with__:
|
@@ -1095,27 +1097,39 @@ def prepare_result(self, result, collection=False):
|
1095 | 1097 | if self._model:
|
1096 | 1098 | # eager load here
|
1097 | 1099 | hydrated_model = self._model.hydrate(result)
|
1098 |
| - if self._eager_loads and hydrated_model: |
1099 |
| - for eager in self._eager_loads: |
1100 |
| - if "." in eager: |
1101 |
| - last_owner = self._model |
1102 |
| - last_result = hydrated_model |
1103 |
| - for eager in eager.split("."): |
1104 |
| - related = getattr(last_owner, eager) |
1105 |
| - result_set = related.get_related(last_result) |
| 1100 | + if self._eager_relation.eagers and hydrated_model: |
| 1101 | + for eager_load in self._eager_relation.get_eagers(): |
| 1102 | + if isinstance(eager_load, dict): |
| 1103 | + # Nested |
| 1104 | + for relation, eagers in eager_load.items(): |
| 1105 | + if inspect.isclass(self._model): |
| 1106 | + related = getattr(self._model, relation) |
| 1107 | + else: |
| 1108 | + related = self._model.get_related(relation) |
| 1109 | + |
| 1110 | + result_set = related.get_related( |
| 1111 | + hydrated_model, eagers=eagers |
| 1112 | + ) |
1106 | 1113 |
|
1107 | 1114 | self._register_relationships_to_model(
|
1108 |
| - related, result_set, last_result, relation_key=eager |
| 1115 | + related, |
| 1116 | + result_set, |
| 1117 | + hydrated_model, |
| 1118 | + relation_key=relation, |
1109 | 1119 | )
|
1110 |
| - |
1111 |
| - last_result = result_set |
1112 |
| - last_owner = related.get_builder()._model |
1113 | 1120 | else:
|
1114 |
| - related = getattr(self._model, eager) |
1115 |
| - related_result = related.get_related(hydrated_model) |
1116 |
| - self._register_relationships_to_model( |
1117 |
| - related, related_result, hydrated_model, relation_key=eager |
1118 |
| - ) |
| 1121 | + # Not Nested |
| 1122 | + for eager in eager_load: |
| 1123 | + if inspect.isclass(self._model): |
| 1124 | + related = getattr(self._model, eager) |
| 1125 | + else: |
| 1126 | + related = self._model.get_related(eager) |
| 1127 | + |
| 1128 | + result_set = related.get_related(hydrated_model) |
| 1129 | + |
| 1130 | + self._register_relationships_to_model( |
| 1131 | + related, result_set, hydrated_model, relation_key=eager |
| 1132 | + ) |
1119 | 1133 |
|
1120 | 1134 | if collection:
|
1121 | 1135 | return hydrated_model if result else Collection([])
|
@@ -1149,7 +1163,6 @@ def _register_relationships_to_model(
|
1149 | 1163 | else:
|
1150 | 1164 | model.add_relation({relation_key: related_result or None})
|
1151 | 1165 | else:
|
1152 |
| - |
1153 | 1166 | hydrated_model.add_relation({relation_key: related_result or None})
|
1154 | 1167 | return self
|
1155 | 1168 |
|
@@ -1192,14 +1205,8 @@ def without_eager(self):
|
1192 | 1205 | self._should_eager = False
|
1193 | 1206 | return self
|
1194 | 1207 |
|
1195 |
| - def with_(self, eagers=(), *others): |
1196 |
| - if not isinstance(eagers, (tuple, list)): |
1197 |
| - eagers = (eagers,) |
1198 |
| - |
1199 |
| - if others: |
1200 |
| - eagers += others |
1201 |
| - |
1202 |
| - self._eager_loads += eagers |
| 1208 | + def with_(self, *eagers): |
| 1209 | + self._eager_relation.register(eagers) |
1203 | 1210 | return self
|
1204 | 1211 |
|
1205 | 1212 | def paginate(self, per_page, page=1):
|
|
0 commit comments