Example #1
0
 /**
  * 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);
     }
 }