Skip to content

Commit

Permalink
Update DataTable.php
Browse files Browse the repository at this point in the history
  • Loading branch information
wimurk authored Aug 4, 2022
1 parent 17f8571 commit c7ad080
Showing 1 changed file with 36 additions and 27 deletions.
63 changes: 36 additions & 27 deletions src/Controllers/DataTable.php
Original file line number Diff line number Diff line change
Expand Up @@ -328,9 +328,9 @@ private function sortModel()
}

try{
return $model->prefix($this->tableModel->elequentPrefix)->{$this->tableModel->elequentMethod}();
return $model->prefix($this->tableModel->elequentPrefix)->{$this->tableModel->elequentMethod}()->unique('id');
} catch (Exception $ex) {
return $model->get();
return $model->get()->unique('id');
}
}

Expand Down Expand Up @@ -371,11 +371,13 @@ private function runOrderBuild($model, array $order)
private function orderRelation(mixed $model, array $order, array $select = []) : mixed
{
$relation = $this->getPath($this->findOriginalColumn($order['column']));

switch($this->getClassName($relation)){

case "BelongsToMany":
return $this->orderOnBelongsToMany($model, $order);
case "HasOneThrough":
return $this->orderOnHasOneThrough($model, $order);
default :
return $this->orderOnDefaultRelation($model, $order);
}
Expand All @@ -402,9 +404,9 @@ private function orderOnDefaultRelation(mixed $model, array $order) : Builder
$as = str_replace('.', '_', "$relationName$name");

$select[] = "$relationName.$name as $as";

return $model->with($relation)
->join($relationName, $foreignName, '=', $ownerName)
->leftJoin($relationName, $foreignName, '=', $ownerName)
->select($select)
->orderBy("$as", $order['dir']);
}
Expand Down Expand Up @@ -432,12 +434,38 @@ private function orderOnBelongsToMany(mixed $model, array $order) : Builder
$select[] = "{$order['column']} as {$relation}_{$name}";

return $model
->leftJoin($relationName, \Illuminate\Support\Str::after($foreignName, '.'), $parentOwner)
->leftJoin($relationName, str($foreignName)->afterLast('.'), $parentOwner)
->leftJoin($relation, $ownerName, "$relation.$relatedOwner")
->select($select)
->orderBy("{$relation}_{$name}", $order['dir']);
}

/**
* @param mixed $model
* @param array $order
* @return Builder
*/
private function orderOnHasOneThrough(mixed $model, array $order) : Builder
{
$name = $this->getName($this->findOriginalColumn($order['column']));
$relation = $this->getPath($this->findOriginalColumn($order['column']));

$foreignKeyName = $this->originalModel->{$relation}()->getQualifiedForeignKeyName();
$firstKeyName = $this->originalModel->{$relation}()->getQualifiedForeignKeyName();
$localKeyName = $this->originalModel->{$relation}()->getQualifiedLocalKeyName();
$parentKeyName = $this->originalModel->{$relation}()->getQualifiedParentKeyName();

$select = $this->queryColumns($model, $model->getModel()->getTable());

$select[] = str($foreignKeyName)->beforeLast('.').".$name as {$relation}_{$name}";

return $model
->leftJoin(str($parentKeyName)->beforeLast('.'), $localKeyName, '=', $parentKeyName)
->leftJoin(str($foreignKeyName)->beforeLast('.'), $firstKeyName, '=', $foreignKeyName)
->select($select)
->orderBy("{$relation}_{$name}", $order['dir']);
}

/**
* @param mixed $model
* @param string $owner
Expand All @@ -459,27 +487,6 @@ private function queryColumns(mixed $model, string $owner) : array
return $select;
}

/**
* @param string $string
* @param string $start
* @param string $end
* @return string
*/
private function stringBetween(string $string, string $start, string $end) : string
{
$string = ' ' . $string;
$ini = strpos($string, $start);

if ($ini == 0){
return '';
}

$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;

return substr($string, $ini, $len);
}

/**
* @param string $data
* @return array|null
Expand Down Expand Up @@ -547,6 +554,8 @@ private function getOwnerName(string $relation)
return $this->originalModel->{$relation}()->getQualifiedForeignKeyName();
case "BelongsToMany" :
return $this->originalModel->{$relation}()->getQualifiedRelatedPivotKeyName();
case "HasOneThrough" :
return $this->originalModel->{$relation}()->getQualifiedForeignKeyName();
default :
return $this->originalModel->{$relation}()->getQualifiedOwnerKeyName();
}
Expand Down

0 comments on commit c7ad080

Please sign in to comment.