@@ -328,9 +328,9 @@ private function sortModel()
328328 }
329329
330330 try {
331- return $ model ->prefix ($ this ->tableModel ->elequentPrefix )->{$ this ->tableModel ->elequentMethod }();
331+ return $ model ->prefix ($ this ->tableModel ->elequentPrefix )->{$ this ->tableModel ->elequentMethod }()-> unique ( ' id ' ) ;
332332 } catch (Exception $ ex ) {
333- return $ model ->get ();
333+ return $ model ->get ()-> unique ( ' id ' ) ;
334334 }
335335 }
336336
@@ -371,11 +371,13 @@ private function runOrderBuild($model, array $order)
371371 private function orderRelation (mixed $ model , array $ order , array $ select = []) : mixed
372372 {
373373 $ relation = $ this ->getPath ($ this ->findOriginalColumn ($ order ['column ' ]));
374-
374+
375375 switch ($ this ->getClassName ($ relation )){
376376
377377 case "BelongsToMany " :
378378 return $ this ->orderOnBelongsToMany ($ model , $ order );
379+ case "HasOneThrough " :
380+ return $ this ->orderOnHasOneThrough ($ model , $ order );
379381 default :
380382 return $ this ->orderOnDefaultRelation ($ model , $ order );
381383 }
@@ -402,9 +404,9 @@ private function orderOnDefaultRelation(mixed $model, array $order) : Builder
402404 $ as = str_replace ('. ' , '_ ' , "$ relationName$ name " );
403405
404406 $ select [] = "$ relationName. $ name as $ as " ;
405-
407+
406408 return $ model ->with ($ relation )
407- ->join ($ relationName , $ foreignName , '= ' , $ ownerName )
409+ ->leftJoin ($ relationName , $ foreignName , '= ' , $ ownerName )
408410 ->select ($ select )
409411 ->orderBy ("$ as " , $ order ['dir ' ]);
410412 }
@@ -432,12 +434,38 @@ private function orderOnBelongsToMany(mixed $model, array $order) : Builder
432434 $ select [] = "{$ order ['column ' ]} as {$ relation }_ {$ name }" ;
433435
434436 return $ model
435- ->leftJoin ($ relationName , \ Illuminate \ Support \Str:: after ($ foreignName, '. ' ), $ parentOwner )
437+ ->leftJoin ($ relationName , str ($ foreignName)-> afterLast ( '. ' ), $ parentOwner )
436438 ->leftJoin ($ relation , $ ownerName , "$ relation. $ relatedOwner " )
437439 ->select ($ select )
438440 ->orderBy ("{$ relation }_ {$ name }" , $ order ['dir ' ]);
439441 }
440442
443+ /**
444+ * @param mixed $model
445+ * @param array $order
446+ * @return Builder
447+ */
448+ private function orderOnHasOneThrough (mixed $ model , array $ order ) : Builder
449+ {
450+ $ name = $ this ->getName ($ this ->findOriginalColumn ($ order ['column ' ]));
451+ $ relation = $ this ->getPath ($ this ->findOriginalColumn ($ order ['column ' ]));
452+
453+ $ foreignKeyName = $ this ->originalModel ->{$ relation }()->getQualifiedForeignKeyName ();
454+ $ firstKeyName = $ this ->originalModel ->{$ relation }()->getQualifiedForeignKeyName ();
455+ $ localKeyName = $ this ->originalModel ->{$ relation }()->getQualifiedLocalKeyName ();
456+ $ parentKeyName = $ this ->originalModel ->{$ relation }()->getQualifiedParentKeyName ();
457+
458+ $ select = $ this ->queryColumns ($ model , $ model ->getModel ()->getTable ());
459+
460+ $ select [] = str ($ foreignKeyName )->beforeLast ('. ' ).". $ name as {$ relation }_ {$ name }" ;
461+
462+ return $ model
463+ ->leftJoin (str ($ parentKeyName )->beforeLast ('. ' ), $ localKeyName , '= ' , $ parentKeyName )
464+ ->leftJoin (str ($ foreignKeyName )->beforeLast ('. ' ), $ firstKeyName , '= ' , $ foreignKeyName )
465+ ->select ($ select )
466+ ->orderBy ("{$ relation }_ {$ name }" , $ order ['dir ' ]);
467+ }
468+
441469 /**
442470 * @param mixed $model
443471 * @param string $owner
@@ -459,27 +487,6 @@ private function queryColumns(mixed $model, string $owner) : array
459487 return $ select ;
460488 }
461489
462- /**
463- * @param string $string
464- * @param string $start
465- * @param string $end
466- * @return string
467- */
468- private function stringBetween (string $ string , string $ start , string $ end ) : string
469- {
470- $ string = ' ' . $ string ;
471- $ ini = strpos ($ string , $ start );
472-
473- if ($ ini == 0 ){
474- return '' ;
475- }
476-
477- $ ini += strlen ($ start );
478- $ len = strpos ($ string , $ end , $ ini ) - $ ini ;
479-
480- return substr ($ string , $ ini , $ len );
481- }
482-
483490 /**
484491 * @param string $data
485492 * @return array|null
@@ -547,6 +554,8 @@ private function getOwnerName(string $relation)
547554 return $ this ->originalModel ->{$ relation }()->getQualifiedForeignKeyName ();
548555 case "BelongsToMany " :
549556 return $ this ->originalModel ->{$ relation }()->getQualifiedRelatedPivotKeyName ();
557+ case "HasOneThrough " :
558+ return $ this ->originalModel ->{$ relation }()->getQualifiedForeignKeyName ();
550559 default :
551560 return $ this ->originalModel ->{$ relation }()->getQualifiedOwnerKeyName ();
552561 }
0 commit comments