diff --git a/src/DataTables/Adapter/CustomORMAdapter.php b/src/DataTables/Adapter/CustomORMAdapter.php new file mode 100644 index 00000000..70d5ef6c --- /dev/null +++ b/src/DataTables/Adapter/CustomORMAdapter.php @@ -0,0 +1,81 @@ +hydrationMode = isset($options['hydrate']) ? $options['hydrate'] : Query::HYDRATE_OBJECT; + } + protected function prepareQuery(AdapterQuery $query) + { + parent::prepareQuery($query); + $query->setIdentifierPropertyPath(null); + } + /** + * @param AdapterQuery $query + * @return \Traversable + */ + protected function getResults(AdapterQuery $query): \Traversable + { + /** @var QueryBuilder $builder */ + $builder = $query->get('qb'); + $state = $query->getState(); + // Apply definitive view state for current 'page' of the table + foreach ($state->getOrderBy() as list($column, $direction)) { + /** @var AbstractColumn $column */ + if ($column->isOrderable()) { + $builder->addOrderBy($column->getOrderField(), $direction); + } + } + if ($state->getLength() > 0) { + $builder + ->setFirstResult($state->getStart()) + ->setMaxResults($state->getLength()); + } + /* + * Use foreach instead of iterate to prevent group by from crashing + */ + foreach ($builder->getQuery()->getResult($this->hydrationMode) as $result) { + /* + * Return everything instead of first element + */ + yield $result; + } + } +} \ No newline at end of file diff --git a/src/DataTables/PartsDataTable.php b/src/DataTables/PartsDataTable.php index 626ff52e..77e19b16 100644 --- a/src/DataTables/PartsDataTable.php +++ b/src/DataTables/PartsDataTable.php @@ -21,6 +21,7 @@ namespace App\DataTables; +use App\DataTables\Adapter\CustomORMAdapter; use App\DataTables\Column\EntityColumn; use App\DataTables\Column\LocaleDateTimeColumn; use App\DataTables\Column\MarkdownColumn; @@ -84,14 +85,20 @@ class PartsDataTable implements DataTableTypeInterface ->addSelect('partUnit') ->addSelect('master_picture_attachment') ->addSelect('footprint_attachment') + ->addSelect('partLots') + ->addSelect('orderdetails') + ->addSelect('attachments') + ->addSelect('storelocations') ->from(Part::class, 'part') ->leftJoin('part.category', 'category') ->leftJoin('part.master_picture_attachment', 'master_picture_attachment') ->leftJoin('part.partLots', 'partLots') + ->leftJoin('partLots.storage_location', 'storelocations') ->leftJoin('part.footprint', 'footprint') ->leftJoin('footprint.master_picture_attachment', 'footprint_attachment') ->leftJoin('part.manufacturer', 'manufacturer') ->leftJoin('part.orderdetails', 'orderdetails') + ->leftJoin('part.attachments', 'attachments') ->leftJoin('part.partUnit', 'partUnit'); } @@ -290,7 +297,7 @@ class PartsDataTable implements DataTableTypeInterface ]) ->addOrderBy('name') - ->createAdapter(ORMAdapter::class, [ + ->createAdapter(CustomORMAdapter::class, [ 'query' => function (QueryBuilder $builder) { $this->getQuery($builder); },