9
9
use Fico7489 \Laravel \EloquentJoin \Exceptions \InvalidRelationGlobalScope ;
10
10
use Fico7489 \Laravel \EloquentJoin \Exceptions \InvalidRelationWhere ;
11
11
use Fico7489 \Laravel \EloquentJoin \Relations \BelongsToJoin ;
12
+ use Fico7489 \Laravel \EloquentJoin \Relations \BelongsToManyJoin ;
12
13
use Fico7489 \Laravel \EloquentJoin \Relations \HasManyJoin ;
13
14
use Fico7489 \Laravel \EloquentJoin \Relations \HasOneJoin ;
14
15
use Illuminate \Database \Eloquent \Builder ;
@@ -170,27 +171,32 @@ protected function performJoin($relations, $leftJoin = null)
170
171
$ currentTableAlias = $ baseTable ;
171
172
172
173
$ relationsAccumulated = [];
173
- foreach ($ relations as $ relation ) {
174
- if ($ relation == $ column ) {
175
- //last item in $relations argument is sort|where column
176
- break ;
177
- }
174
+ for ($ i = 0 ; $ i < count ($ relations ) - 1 ; ++$ i ) {
175
+ $ relation = $ relations [$ i ];
176
+ $ nextRelation = $ relations [$ i + 1 ];
178
177
179
178
/** @var Relation $relatedRelation */
180
179
$ relatedRelation = $ currentModel ->$ relation ();
181
180
$ relatedModel = $ relatedRelation ->getRelated ();
182
181
$ relatedPrimaryKey = $ relatedModel ->getKeyName ();
183
182
$ relatedTable = $ relatedModel ->getTable ();
184
- $ relatedTableAlias = $ this ->useTableAlias ? sha1 ($ relatedTable ) : $ relatedTable ;
185
183
186
- $ relationsAccumulated [] = $ relatedTableAlias ;
184
+ $ relationsAccumulated [] = $ relatedTable ;
187
185
$ relationAccumulatedString = implode ('_ ' , $ relationsAccumulated );
188
186
187
+ $ relatedTableAlias = $ this ->useTableAlias ? sha1 ($ relatedTable ) : $ relatedTable ;
188
+
189
189
//relations count
190
190
if ($ this ->appendRelationsCount ) {
191
191
$ this ->selectRaw ('COUNT( ' .$ relatedTableAlias .'. ' .$ relatedPrimaryKey .') as ' .$ relationAccumulatedString .'_count ' );
192
192
}
193
193
194
+ if ($ relatedRelation instanceof BelongsToManyJoin) {
195
+ $ pivotTable = $ relatedRelation ->getTable ();
196
+ $ pivotTableAlias = $ this ->useTableAlias ? sha1 ($ pivotTable ) : $ pivotTable ;
197
+ $ joinQueryPivot = $ pivotTable .($ this ->useTableAlias ? ' as ' .$ pivotTableAlias : '' );
198
+ }
199
+
194
200
if (!in_array ($ relationAccumulatedString , $ this ->joinedTables )) {
195
201
$ joinQuery = $ relatedTable .($ this ->useTableAlias ? ' as ' .$ relatedTableAlias : '' );
196
202
if ($ relatedRelation instanceof BelongsToJoin) {
@@ -212,13 +218,35 @@ protected function performJoin($relations, $leftJoin = null)
212
218
$ this ->$ joinMethod ($ joinQuery , function ($ join ) use ($ relatedRelation , $ relatedTableAlias , $ relatedKey , $ currentTableAlias , $ localKey ) {
213
219
$ join ->on ($ relatedTableAlias .'. ' .$ relatedKey , '= ' , $ currentTableAlias .'. ' .$ localKey );
214
220
221
+ $ this ->joinQuery ($ join , $ relatedRelation , $ relatedTableAlias );
222
+ });
223
+ } elseif ($ relatedRelation instanceof BelongsToManyJoin) {
224
+ $ localPivotKey = $ relatedRelation ->getForeignPivotKeyName ();
225
+ $ relatedPivotKey = $ relatedRelation ->getRelatedPivotKeyName ();
226
+ $ localKey = $ relatedRelation ->getParentKeyName ();
227
+ $ relatedKey = $ relatedRelation ->getRelatedKeyName ();
228
+
229
+ $ this ->$ joinMethod ($ joinQueryPivot , function ($ join ) use ($ relatedRelation , $ pivotTableAlias , $ localPivotKey , $ currentTableAlias , $ localKey ) {
230
+ $ join ->on ($ pivotTableAlias .'. ' .$ localPivotKey , '= ' , $ currentTableAlias .'. ' .$ localKey );
231
+
232
+ $ this ->joinQuery ($ join , $ relatedRelation , $ pivotTableAlias );
233
+ });
234
+
235
+ $ this ->$ joinMethod ($ joinQuery , function ($ join ) use ($ relatedRelation , $ relatedTableAlias , $ relatedKey , $ pivotTableAlias , $ relatedPivotKey ) {
236
+ $ join ->on ($ relatedTableAlias .'. ' .$ relatedKey , '= ' , $ pivotTableAlias .'. ' .$ relatedPivotKey );
237
+
215
238
$ this ->joinQuery ($ join , $ relatedRelation , $ relatedTableAlias );
216
239
});
217
240
} else {
218
241
throw new InvalidRelation ();
219
242
}
220
243
}
221
244
245
+ if ('pivot ' === $ nextRelation ) {
246
+ $ relatedTableAlias = $ pivotTableAlias ;
247
+ ++$ i ;
248
+ }
249
+
222
250
$ currentModel = $ relatedModel ;
223
251
$ currentTableAlias = $ relatedTableAlias ;
224
252
0 commit comments