From def4726c9314abcdbd0b5886ca0f85a460715313 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos Date: Sun, 10 Mar 2024 10:34:24 +0200 Subject: [PATCH] Decloupe where clause construction from join clause construction --- app/src/Controller/StandardController.php | 4 ++ app/src/Lib/Traits/SearchFilterTrait.php | 58 +++++++++++++++-------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/app/src/Controller/StandardController.php b/app/src/Controller/StandardController.php index 91f145147..d5fd11821 100644 --- a/app/src/Controller/StandardController.php +++ b/app/src/Controller/StandardController.php @@ -595,6 +595,10 @@ public function index() { if(!empty($searchableAttributes)) { // Here we iterate over the attributes, and we add a new where clause for each one foreach($searchableAttributes as $attribute => $options) { + // Add the Join Clauses + $query = $table->addJoins($query, $attribute); + + // Construct and apply the where Clause if(!empty($this->request->getQuery($attribute))) { $query = $table->whereFilter($query, $attribute, $this->request->getQuery($attribute)); } elseif (!empty($this->request->getQuery($attribute . '_starts_at')) diff --git a/app/src/Lib/Traits/SearchFilterTrait.php b/app/src/Lib/Traits/SearchFilterTrait.php index 6b6ad17f6..874445495 100644 --- a/app/src/Lib/Traits/SearchFilterTrait.php +++ b/app/src/Lib/Traits/SearchFilterTrait.php @@ -135,39 +135,55 @@ public function setFilterConfig(array $filterConfig): void { $this->filterConfig = $filterConfig; } + /** + * Build the query join associations + * + * @param Query $query + * @param string $attribute + * + * @return object Cake ORM Query object + * * @since COmanage Registry v5.0.0 + */ + public function addJoins(Query $query, string $attribute): object { + // not a permitted attribute + if(empty($this->searchFilters[$attribute]) + || !isset($this->searchFilters[$attribute]['model'])) { + return $query; + } + + $changelog_fk = strtolower(Inflector::underscore($this->searchFilters[$attribute]['model'])) . '_id'; + $fk = strtolower(Inflector::underscore(Inflector::singularize($this->_alias))) . '_id'; + $mtable_name = Inflector::tableize(Inflector::pluralize($this->searchFilters[$attribute]['model'])); + $mtable_alias = Inflector::pluralize($this->searchFilters[$attribute]['model']); + + return $query->join([$mtable_alias => [ + 'table' => $mtable_name, + 'conditions' => [ + $mtable_alias . '.' . $fk . '=' . $this->_alias . '.id', + $mtable_alias . '.' . 'deleted IS NOT TRUE', + $mtable_alias . '.' . $changelog_fk . ' IS NULL' + ], + 'type' => 'INNER' + ]]); + } + /** * Build a query where() clause for the configured attribute. * - * @param Query $query Cake ORM Query object - * @param string $attribute Attribute to filter on (database name) - * @param string|array $q Value to filter on + * @param Query $query Cake ORM Query object + * @param string $attribute Attribute to filter on (database name) + * @param string|array $q Value to filter on * - * @return Query Cake ORM Query object + * @return object Cake ORM Query object * @since COmanage Registry v5.0.0 */ - + public function whereFilter(Query $query, string $attribute, string|array $q): object { // not a permitted attribute if(empty($this->searchFilters[$attribute])) { return $query; } - if(isset($this->searchFilters[$attribute]['model'])) { - $changelog_fk = strtolower(Inflector::underscore($this->searchFilters[$attribute]['model'])) . '_id'; - $fk = strtolower(Inflector::underscore(Inflector::singularize($this->_alias))) . '_id'; - $mtable_name = Inflector::tableize(Inflector::pluralize($this->searchFilters[$attribute]['model'])); - $mtable_alias = Inflector::pluralize($this->searchFilters[$attribute]['model']); - $query->join([$mtable_alias => [ - 'table' => $mtable_name, - 'conditions' => [ - $mtable_alias . '.' . $fk . '=' . $this->_alias . '.id', - $mtable_alias . '.' . 'deleted IS NOT TRUE', - $mtable_alias . '.' . $changelog_fk . ' IS NULL' - ], - 'type' => 'INNER' - ]]); - } - // Prepend the Model name to the attribute $attributeWithModelPrefix = isset($this->searchFilters[$attribute]['model']) ? Inflector::pluralize($this->searchFilters[$attribute]['model']) . '.' . $attribute :