Skip to content

Commit c7ad080

Browse files
authored
Update DataTable.php
1 parent 17f8571 commit c7ad080

1 file changed

Lines changed: 36 additions & 27 deletions

File tree

‎src/Controllers/DataTable.php‎

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)