/** * Join table via many_many relationship * * @param string $parentClass * @param string $componentClass * @param string $parentField * @param string $componentField * @param string $relationTable Name of relation table */ protected function joinManyManyRelationship($parentClass, $componentClass, $parentField, $componentField, $relationTable) { $schema = DataObject::getSchema(); // Join on parent table $parentIDColumn = $schema->sqlColumnForField($parentClass, 'ID'); $this->query->addLeftJoin($relationTable, "\"{$relationTable}\".\"{$parentField}\" = {$parentIDColumn}"); // Join on base table of component class $componentBaseClass = $schema->baseDataClass($componentClass); $componentBaseTable = $schema->tableName($componentBaseClass); $componentIDColumn = $schema->sqlColumnForField($componentBaseClass, 'ID'); if (!$this->query->isJoinedTo($componentBaseTable)) { $this->query->addLeftJoin($componentBaseTable, "\"{$relationTable}\".\"{$componentField}\" = {$componentIDColumn}"); } /** * add join clause to the component's ancestry classes so that the search filter could search on * its ancestor fields. */ $ancestry = ClassInfo::ancestry($componentClass, true); $ancestry = array_reverse($ancestry); foreach ($ancestry as $ancestor) { $ancestorTable = $schema->tableName($ancestor); if ($ancestorTable != $componentBaseTable && !$this->query->isJoinedTo($ancestorTable)) { $this->query->addLeftJoin($ancestorTable, "{$componentIDColumn} = \"{$ancestorTable}\".\"ID\""); } } }