/** * Make sub finds to hasAndBelongsToMany assoc * * @access protected * @return void */ function _subFindHasAndBelongsToMany($data, &$Model, &$query) { foreach ($data as $modelName => $extraConditions) { $pk = $modelName . '.' . $Model->{$modelName}->primaryKey; $removeBehavior = false; if (!$Model->{$modelName}->Behaviors->attached('SuperFind')) { $removeBehavior = true; $Model->{$modelName}->Behaviors->attach('SuperFind.SuperFind'); } $data = $Model->{$modelName}->superFind('all', array('fields' => array($pk), 'conditions' => $extraConditions, 'recursive' => -1)); if ($removeBehavior) { $Model->{$modelName}->Behaviors->detach('SuperFind.SuperFind'); } if (empty($data)) { $query['conditions'] = '1 = 0'; break; } $otherModelIds = array_unique(Set::extract('{n}.' . $pk, $data)); $relationModel = new Model(array('table' => $Model->hasAndBelongsToMany[$modelName]['joinTable'], 'ds' => $Model->useDbConfig, 'name' => 'Relation')); $relationModel->Behaviors->attach('SuperFind.SuperFind'); $data = $relationModel->superFind('all', array('fields' => array($Model->hasAndBelongsToMany[$modelName]['foreignKey']), 'conditions' => array($Model->hasAndBelongsToMany[$modelName]['associationForeignKey'] => $otherModelIds))); unset($relationModel); if (empty($data)) { $query['conditions'] = '1 = 0'; break; } $masterModelIds = array_unique(Set::extract('{n}.Relation.' . $Model->hasAndBelongsToMany[$modelName]['foreignKey'], $data)); $selfPk = $Model->alias . '.' . $Model->primaryKey; if (isset($query['conditions'][$selfPk])) { $query['conditions'][$selfPk] = array_intersect((array) $query['conditions'][$selfPk], $masterModelIds); } else { $query['conditions'][$selfPk] = $masterModelIds; } $this->_addCondition($Model, 'hasAndBelongsToMany', $modelName, $pk, $otherModelIds); } }