From 566f00e8c6da8b9f8ddf98d93803bbc7aa02c5d7 Mon Sep 17 00:00:00 2001 From: Axel Date: Thu, 2 Mar 2023 13:35:25 +0100 Subject: [PATCH 01/10] Improve order and add regex search support --- .../EloquentDataTable/DataTable.php | 49 +++++++++++++------ .../Version109Transformer.php | 9 ++++ .../Version110Transformer.php | 12 +++++ .../VersionTransformerContract.php | 2 + 4 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/LiveControl/EloquentDataTable/DataTable.php b/src/LiveControl/EloquentDataTable/DataTable.php index b226dd3..1220c1e 100644 --- a/src/LiveControl/EloquentDataTable/DataTable.php +++ b/src/LiveControl/EloquentDataTable/DataTable.php @@ -13,6 +13,7 @@ class DataTable { protected $builder; protected $columns; + protected $orderPossibilities; protected $formatRowFunction; /** @@ -22,6 +23,7 @@ class DataTable protected $rawColumns; protected $columnNames; + protected $orderNames; protected $total = 0; protected $filtered = 0; @@ -34,10 +36,11 @@ class DataTable * @param null|callable $formatRowFunction * @throws Exception */ - public function __construct($builder, $columns, $formatRowFunction = null) + public function __construct($builder, $columns, $orderPossibilities = null, $formatRowFunction = null) { $this->setBuilder($builder); $this->setColumns($columns); + $this->setOrderPossibilities($orderPossibilities); if ($formatRowFunction !== null) { $this->setFormatRowFunction($formatRowFunction); @@ -69,6 +72,20 @@ public function setColumns($columns) return $this; } + /** + * @param mixed $columns + * @return $this + */ + public function setOrderPossibilities($columns) + { + if ( $columns !== null ) { + $this->orderPossibilities = $columns; + } else { + $this->orderPossibilities = $this->columns; + } + return $this; + } + /** * @param callable $function * @return $this @@ -97,7 +114,8 @@ public function setVersionTransformer(VersionTransformerContract $versionTransfo public function make() { $this->rawColumns = $this->getRawColumns($this->columns); - $this->columnNames = $this->getColumnNames(); + $this->columnNames = $this->getColumnNames($this->columns); + $this->orderNames = $this->getColumnNames($this->orderPossibilities); $this->addSelect(); @@ -142,7 +160,7 @@ protected function count() $countStatement = $pdo->prepare('SELECT count(*) as totalCount FROM ('.$query->toSql().') subQuery'); $countStatement->execute($query->getBindings()); } - + $result = $countStatement->fetch(); return $result['totalCount']; } @@ -186,10 +204,10 @@ protected function formatRowIndexes($data) /** * @return array */ - protected function getColumnNames() + protected function getColumnNames($columns) { $names = []; - foreach ($this->columns as $index => $column) { + foreach ($columns as $index => $column) { if ($column instanceof ExpressionWithName) { $names[] = $column->getName(); continue; @@ -286,8 +304,9 @@ protected function arrayToCamelcase($array, $inForeach = false) protected function addFilters() { $search = static::$versionTransformer->getSearchValue(); + $regex = static::$versionTransformer->isSearchRegex(); if ($search != '') { - $this->addAllFilter($search); + $this->addAllFilter($search, $regex); } $this->addColumnFilters(); return $this; @@ -296,16 +315,17 @@ protected function addFilters() /** * Searches in all the columns. * @param $search + * @param $regex */ - protected function addAllFilter($search) + protected function addAllFilter($search, $regex) { $this->builder = $this->builder->where( - function ($query) use ($search) { + function ($query) use ($search, $regex) { foreach ($this->columns as $column) { $query->orWhere( new raw($this->getRawColumnQuery($column)), - 'like', - '%' . $search . '%' + $regex ? 'rlike' : 'like', + $regex ? $search : '%' . $search . '%' ); } } @@ -319,10 +339,11 @@ protected function addColumnFilters() { foreach ($this->columns as $i => $column) { if (static::$versionTransformer->isColumnSearched($i)) { + $regex = static::$versionTransformer->isColumnSearchRegex($i); $this->builder->where( new raw($this->getRawColumnQuery($column)), - 'like', - '%' . static::$versionTransformer->getColumnSearchValue($i) . '%' + $regex ? 'rlike' : 'like', + $regex ? static::$versionTransformer->getColumnSearchValue($i) : '%' . static::$versionTransformer->getColumnSearchValue($i) . '%' ); } } @@ -335,9 +356,9 @@ protected function addOrderBy() { if (static::$versionTransformer->isOrdered()) { foreach (static::$versionTransformer->getOrderedColumns() as $index => $direction) { - if (isset($this->columnNames[$index])) { + if (isset($this->orderNames[$index])) { $this->builder->orderBy( - $this->columnNames[$index], + $this->orderNames[$index], $direction ); } diff --git a/src/LiveControl/EloquentDataTable/VersionTransformers/Version109Transformer.php b/src/LiveControl/EloquentDataTable/VersionTransformers/Version109Transformer.php index e0fd923..87c6742 100644 --- a/src/LiveControl/EloquentDataTable/VersionTransformers/Version109Transformer.php +++ b/src/LiveControl/EloquentDataTable/VersionTransformers/Version109Transformer.php @@ -18,6 +18,10 @@ public function transform($name) return (isset($this->translate[$name]) ? $this->translate[$name] : $name); } + public function isSearchRegex() + { + return false; + } public function getSearchValue() { if(isset($_POST['sSearch'])) @@ -30,6 +34,11 @@ public function isColumnSearched($i) return (isset($_POST['bSearchable_' . $i]) && $_POST['bSearchable_' . $i] == 'true' && $_POST['sSearch_' . $i] != ''); } + public function isColumnSearchRegex($columnIndex) + { + return false; + } + public function getColumnSearchValue($i) { return $_POST['sSearch_' . $i]; diff --git a/src/LiveControl/EloquentDataTable/VersionTransformers/Version110Transformer.php b/src/LiveControl/EloquentDataTable/VersionTransformers/Version110Transformer.php index c42b692..69a5fa4 100644 --- a/src/LiveControl/EloquentDataTable/VersionTransformers/Version110Transformer.php +++ b/src/LiveControl/EloquentDataTable/VersionTransformers/Version110Transformer.php @@ -8,6 +8,13 @@ public function transform($name) return $name; // we use the same as the requested name } + public function isSearchRegex() + { + if(isset($_POST['search']) && isset($_POST['search']['regex'])) + return $_POST['search']['regex']; + return false; + } + public function getSearchValue() { if(isset($_POST['search']) && isset($_POST['search']['value'])) @@ -30,6 +37,11 @@ public function isColumnSearched($columnIndex) ); } + public function isColumnSearchRegex($columnIndex) + { + return $_POST['columns'][$columnIndex]['search']['regex']; + } + public function getColumnSearchValue($columnIndex) { return $_POST['columns'][$columnIndex]['search']['value']; diff --git a/src/LiveControl/EloquentDataTable/VersionTransformers/VersionTransformerContract.php b/src/LiveControl/EloquentDataTable/VersionTransformers/VersionTransformerContract.php index e37a6de..506a200 100644 --- a/src/LiveControl/EloquentDataTable/VersionTransformers/VersionTransformerContract.php +++ b/src/LiveControl/EloquentDataTable/VersionTransformers/VersionTransformerContract.php @@ -5,9 +5,11 @@ interface VersionTransformerContract { public function transform($name); + public function isSearchRegex(); public function getSearchValue(); public function isColumnSearched($columnIndex); + public function isColumnSearchRegex($columnIndex); public function getColumnSearchValue($columnIndex); From a37ac914d502add0d91330272bcea06b6b5f4eea Mon Sep 17 00:00:00 2001 From: Axel Date: Thu, 2 Mar 2023 13:45:09 +0100 Subject: [PATCH 02/10] Add compatibility for illuminate db --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 55b03c7..20bf142 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ ], "require": { "php": ">=5.4.0", - "illuminate/database": "5.*" + "illuminate/database": "^5.0|^6.0|^7.0|^8.0|^9.0" }, "require-dev": { "phpspec/phpspec": "~2.1" From ed8283b7c4273a1d3352d784728f4ce408fbc407 Mon Sep 17 00:00:00 2001 From: SchoppAx Date: Thu, 22 Jun 2023 10:08:41 +0200 Subject: [PATCH 03/10] Resolve packagist same vendor name --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 20bf142..1a2e1cc 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "livecontrol/eloquent-datatable", + "name": "schoppax/eloquent-datatable", "description": "Eloquent DataTable plugin for server side ajax call handling.", "keywords": [ "eloquent", From cf276eb1cf8659b4b226f7397a0db911c3f419fb Mon Sep 17 00:00:00 2001 From: Axel Date: Mon, 9 Oct 2023 21:50:15 +0200 Subject: [PATCH 04/10] :arrow_up: Support eloquent 5.7 and above --- composer.json | 2 +- src/LiveControl/EloquentDataTable/DataTable.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 1a2e1cc..26d225d 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ ], "require": { "php": ">=5.4.0", - "illuminate/database": "^5.0|^6.0|^7.0|^8.0|^9.0" + "illuminate/database": "^5.7|^6.0|^7.0|^8.0|^9.0" }, "require-dev": { "phpspec/phpspec": "~2.1" diff --git a/src/LiveControl/EloquentDataTable/DataTable.php b/src/LiveControl/EloquentDataTable/DataTable.php index 1220c1e..d0cb3d8 100644 --- a/src/LiveControl/EloquentDataTable/DataTable.php +++ b/src/LiveControl/EloquentDataTable/DataTable.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Query\Expression as raw; +use Illuminate\Support\Str; use LiveControl\EloquentDataTable\VersionTransformers\Version110Transformer; use LiveControl\EloquentDataTable\VersionTransformers\VersionTransformerContract; @@ -294,7 +295,7 @@ protected function arrayToCamelcase($array, $inForeach = false) $result[] = $value; } - return (! $inForeach ? camel_case(implode('_', $result)) : $result); + return (! $inForeach ? Str::camel(implode('_', $result)) : $result); } /** From 77d9f530fe746bc74eeabfa591e227d1a2604b5e Mon Sep 17 00:00:00 2001 From: Axel Date: Wed, 18 Oct 2023 12:20:04 +0200 Subject: [PATCH 05/10] :beetle: Fix rlike search is used everytime and add type declarations --- .../Version109Transformer.php | 16 +++++++------- .../Version110Transformer.php | 22 ++++++++++--------- .../VersionTransformerContract.php | 16 +++++++------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/LiveControl/EloquentDataTable/VersionTransformers/Version109Transformer.php b/src/LiveControl/EloquentDataTable/VersionTransformers/Version109Transformer.php index 87c6742..70d4bd4 100644 --- a/src/LiveControl/EloquentDataTable/VersionTransformers/Version109Transformer.php +++ b/src/LiveControl/EloquentDataTable/VersionTransformers/Version109Transformer.php @@ -13,43 +13,43 @@ class Version109Transformer implements VersionTransformerContract ]; - public function transform($name) + public function transform($name): string { return (isset($this->translate[$name]) ? $this->translate[$name] : $name); } - public function isSearchRegex() + public function isSearchRegex(): bool { return false; } - public function getSearchValue() + public function getSearchValue(): string { if(isset($_POST['sSearch'])) return $_POST['sSearch']; return ''; } - public function isColumnSearched($i) + public function isColumnSearched($i): bool { return (isset($_POST['bSearchable_' . $i]) && $_POST['bSearchable_' . $i] == 'true' && $_POST['sSearch_' . $i] != ''); } - public function isColumnSearchRegex($columnIndex) + public function isColumnSearchRegex($columnIndex): bool { return false; } - public function getColumnSearchValue($i) + public function getColumnSearchValue($i): string { return $_POST['sSearch_' . $i]; } - public function isOrdered() + public function isOrdered(): bool { return isset($_POST['iSortCol_0']); } - public function getOrderedColumns() + public function getOrderedColumns(): array { $columns = []; for ($i = 0; $i < (int) $_POST['iSortingCols']; $i ++) { diff --git a/src/LiveControl/EloquentDataTable/VersionTransformers/Version110Transformer.php b/src/LiveControl/EloquentDataTable/VersionTransformers/Version110Transformer.php index 69a5fa4..6249978 100644 --- a/src/LiveControl/EloquentDataTable/VersionTransformers/Version110Transformer.php +++ b/src/LiveControl/EloquentDataTable/VersionTransformers/Version110Transformer.php @@ -3,26 +3,26 @@ class Version110Transformer implements VersionTransformerContract { - public function transform($name) + public function transform($name): string { return $name; // we use the same as the requested name } - public function isSearchRegex() + public function isSearchRegex(): bool { if(isset($_POST['search']) && isset($_POST['search']['regex'])) - return $_POST['search']['regex']; + return filter_var($_POST['search']['regex'], FILTER_VALIDATE_BOOLEAN); return false; } - public function getSearchValue() + public function getSearchValue(): string { if(isset($_POST['search']) && isset($_POST['search']['value'])) return $_POST['search']['value']; return ''; } - public function isColumnSearched($columnIndex) + public function isColumnSearched($columnIndex): bool { return ( isset($_POST['columns']) @@ -37,22 +37,24 @@ public function isColumnSearched($columnIndex) ); } - public function isColumnSearchRegex($columnIndex) + public function isColumnSearchRegex($columnIndex): bool { - return $_POST['columns'][$columnIndex]['search']['regex']; + if (isset($_POST['columns'][$columnIndex]['search']['regex'])) + return filter_var($_POST['columns'][$columnIndex]['search']['regex'], FILTER_VALIDATE_BOOLEAN); + return false; } - public function getColumnSearchValue($columnIndex) + public function getColumnSearchValue($columnIndex): string { return $_POST['columns'][$columnIndex]['search']['value']; } - public function isOrdered() + public function isOrdered(): bool { return (isset($_POST['order']) && isset($_POST['order'][0])); } - public function getOrderedColumns() + public function getOrderedColumns(): array { $columns = []; foreach($_POST['order'] as $i => $order) diff --git a/src/LiveControl/EloquentDataTable/VersionTransformers/VersionTransformerContract.php b/src/LiveControl/EloquentDataTable/VersionTransformers/VersionTransformerContract.php index 506a200..7e495bc 100644 --- a/src/LiveControl/EloquentDataTable/VersionTransformers/VersionTransformerContract.php +++ b/src/LiveControl/EloquentDataTable/VersionTransformers/VersionTransformerContract.php @@ -3,16 +3,16 @@ interface VersionTransformerContract { - public function transform($name); + public function transform($name): string; - public function isSearchRegex(); - public function getSearchValue(); + public function isSearchRegex(): bool; + public function getSearchValue(): string; - public function isColumnSearched($columnIndex); - public function isColumnSearchRegex($columnIndex); - public function getColumnSearchValue($columnIndex); + public function isColumnSearched($columnIndex): bool; + public function isColumnSearchRegex($columnIndex): bool; + public function getColumnSearchValue($columnIndex): string; - public function isOrdered(); - public function getOrderedColumns(); + public function isOrdered(): bool; + public function getOrderedColumns(): array; } \ No newline at end of file From a2020d2701c071339fab2e2699fede3c28acf3b3 Mon Sep 17 00:00:00 2001 From: Axel Date: Wed, 18 Oct 2023 12:22:25 +0200 Subject: [PATCH 06/10] :beetle: Fix invalid use of group function on filter if statement includes aggregate function --- .../EloquentDataTable/DataTable.php | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/LiveControl/EloquentDataTable/DataTable.php b/src/LiveControl/EloquentDataTable/DataTable.php index d0cb3d8..d3407a9 100644 --- a/src/LiveControl/EloquentDataTable/DataTable.php +++ b/src/LiveControl/EloquentDataTable/DataTable.php @@ -31,6 +31,11 @@ class DataTable protected $rows = []; + protected $mySqlAggFncs = [ + "AVG(","BIT_AND(","BIT_OR(","BIT_XOR(","COUNT(","GROUP_CONCAT(","JSON_ARRAYAGG(","JSON_OBJECTAGG(","MAX(", + "MIN(","STD(","STDDEV(","STDDEV_POP(","STDDEV_SAMP(","SUM(","VAR_POP(","VAR_SAMP(","VARIANCE(" + ]; + /** * @param Builder|Model $builder * @param array $columns @@ -298,6 +303,21 @@ protected function arrayToCamelcase($array, $inForeach = false) return (! $inForeach ? Str::camel(implode('_', $result)) : $result); } + /** + * Checks if the query includes aggregate functions + * @return bool + */ + protected function hasAggregateFunction() + { + $query = $this->builder->toSql() ?? $this->builder->getQuery()->toSql(); + foreach($this->mySqlAggFncs as $aggFnc) { + if (stripos($query, $aggFnc) !== false) { + return true; + } + } + return false; + } + /** * Add the filters based on the search value given. * @return $this @@ -306,10 +326,11 @@ protected function addFilters() { $search = static::$versionTransformer->getSearchValue(); $regex = static::$versionTransformer->isSearchRegex(); + $aggregate = $this->hasAggregateFunction(); if ($search != '') { - $this->addAllFilter($search, $regex); + $this->addAllFilter($search, $regex, $aggregate); } - $this->addColumnFilters(); + $this->addColumnFilters($aggregate); return $this; } @@ -318,12 +339,13 @@ protected function addFilters() * @param $search * @param $regex */ - protected function addAllFilter($search, $regex) + protected function addAllFilter($search, $regex, $aggregate) { - $this->builder = $this->builder->where( + $method = $aggregate ? 'Having' : 'Where'; + $this->builder = $this->builder->{strtolower($method)}( function ($query) use ($search, $regex) { foreach ($this->columns as $column) { - $query->orWhere( + $query->{"or"$method}( new raw($this->getRawColumnQuery($column)), $regex ? 'rlike' : 'like', $regex ? $search : '%' . $search . '%' @@ -336,12 +358,13 @@ function ($query) use ($search, $regex) { /** * Add column specific filters. */ - protected function addColumnFilters() + protected function addColumnFilters($aggregate) { foreach ($this->columns as $i => $column) { if (static::$versionTransformer->isColumnSearched($i)) { $regex = static::$versionTransformer->isColumnSearchRegex($i); - $this->builder->where( + $method = $aggregate ? 'having' : 'where'; + $this->builder->{$method}( new raw($this->getRawColumnQuery($column)), $regex ? 'rlike' : 'like', $regex ? static::$versionTransformer->getColumnSearchValue($i) : '%' . static::$versionTransformer->getColumnSearchValue($i) . '%' From f49f6db38d58049007cecd4edb7e1423e201b4ff Mon Sep 17 00:00:00 2001 From: Axel Date: Wed, 18 Oct 2023 13:11:25 +0200 Subject: [PATCH 07/10] :beetle: Fix unexpected variable --- src/LiveControl/EloquentDataTable/DataTable.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LiveControl/EloquentDataTable/DataTable.php b/src/LiveControl/EloquentDataTable/DataTable.php index d3407a9..8edbdee 100644 --- a/src/LiveControl/EloquentDataTable/DataTable.php +++ b/src/LiveControl/EloquentDataTable/DataTable.php @@ -343,9 +343,9 @@ protected function addAllFilter($search, $regex, $aggregate) { $method = $aggregate ? 'Having' : 'Where'; $this->builder = $this->builder->{strtolower($method)}( - function ($query) use ($search, $regex) { + function ($query) use ($search, $regex, $method) { foreach ($this->columns as $column) { - $query->{"or"$method}( + $query->{"or$method"}( new raw($this->getRawColumnQuery($column)), $regex ? 'rlike' : 'like', $regex ? $search : '%' . $search . '%' From 8782a8bbbd171c8ade27ba31efef12094b47d23c Mon Sep 17 00:00:00 2001 From: SchoppAx Date: Fri, 12 Jul 2024 13:35:00 +0200 Subject: [PATCH 08/10] :arrow_up: Add support for all new illuminate database versions --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 26d225d..fef00a3 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ ], "require": { "php": ">=5.4.0", - "illuminate/database": "^5.7|^6.0|^7.0|^8.0|^9.0" + "illuminate/database": ">=5.7.5" }, "require-dev": { "phpspec/phpspec": "~2.1" From ee83e04f9568914223a4e71b9f5a9db01f46ecda Mon Sep 17 00:00:00 2001 From: Axel Schoppe Date: Tue, 23 Jul 2024 16:17:02 +0200 Subject: [PATCH 09/10] :bug: Fix concat columns could not be filtered if query has aggregate function --- src/LiveControl/EloquentDataTable/DataTable.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/LiveControl/EloquentDataTable/DataTable.php b/src/LiveControl/EloquentDataTable/DataTable.php index 8edbdee..bb2c94f 100644 --- a/src/LiveControl/EloquentDataTable/DataTable.php +++ b/src/LiveControl/EloquentDataTable/DataTable.php @@ -342,11 +342,12 @@ protected function addFilters() protected function addAllFilter($search, $regex, $aggregate) { $method = $aggregate ? 'Having' : 'Where'; + $columns = $aggregate ? $this->columnNames : $this->columns; $this->builder = $this->builder->{strtolower($method)}( - function ($query) use ($search, $regex, $method) { - foreach ($this->columns as $column) { + function ($query) use ($search, $regex, $method, $columns, $aggregate) { + foreach ($columns as $column) { $query->{"or$method"}( - new raw($this->getRawColumnQuery($column)), + new raw($aggregate ? $column : $this->getRawColumnQuery($column)), $regex ? 'rlike' : 'like', $regex ? $search : '%' . $search . '%' ); @@ -360,12 +361,13 @@ function ($query) use ($search, $regex, $method) { */ protected function addColumnFilters($aggregate) { - foreach ($this->columns as $i => $column) { + $columns = $aggregate ? $this->columnNames : $this->columns; + foreach ($columns as $i => $column) { if (static::$versionTransformer->isColumnSearched($i)) { $regex = static::$versionTransformer->isColumnSearchRegex($i); $method = $aggregate ? 'having' : 'where'; $this->builder->{$method}( - new raw($this->getRawColumnQuery($column)), + new raw($aggregate ? $column : $this->getRawColumnQuery($column)), $regex ? 'rlike' : 'like', $regex ? static::$versionTransformer->getColumnSearchValue($i) : '%' . static::$versionTransformer->getColumnSearchValue($i) . '%' ); From ec002a579fb0a611bc794b6abee6ebb7805d7fde Mon Sep 17 00:00:00 2001 From: Axel Schoppe Date: Fri, 26 Jul 2024 23:50:39 +0200 Subject: [PATCH 10/10] :bug: Fix datatables with ExpressionWithName condition couldn't converted to raw --- src/LiveControl/EloquentDataTable/DataTable.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/LiveControl/EloquentDataTable/DataTable.php b/src/LiveControl/EloquentDataTable/DataTable.php index bb2c94f..08cfe56 100644 --- a/src/LiveControl/EloquentDataTable/DataTable.php +++ b/src/LiveControl/EloquentDataTable/DataTable.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Query\Expression as raw; +use Illuminate\Database\Query\Grammars\Grammar; use Illuminate\Support\Str; use LiveControl\EloquentDataTable\VersionTransformers\Version110Transformer; use LiveControl\EloquentDataTable\VersionTransformers\VersionTransformerContract; @@ -248,7 +249,8 @@ protected function getRawColumns($columns) protected function getRawColumnQuery($column) { if ($column instanceof ExpressionWithName) { - return $column->getExpression(); + $gramma = new Grammar(); + return $column->getExpression()->getValue($gramma); } if (is_array($column)) {