public function associatedRecords(ActiveRecord $Record)
 {
     $referenceRecord = $Record->getRecord();
     $foreignKey = $this->_Association->getDefinition('foreignKey');
     if (is_null($referenceRecord[$foreignKey])) {
         return array(null);
     }
     // The record has a foreign key, but has not the associated Active Record.
     // First try to find the Active Record in the pool, if not query it.
     $relatedRecord = ActiveRecordManager::findActiveRecordInPool($this->_Association->getModel(), $referenceRecord[$foreignKey]);
     if ($relatedRecord === false) {
         $relatedRecord = $this->_Association->getModel()->find('first', array('conditions' => array($this->_Association->getPrimaryKey() => $referenceRecord[$foreignKey]), 'recursive' => -1, 'activeRecord' => false));
         if ($relatedRecord) {
             $relatedRecord = ActiveRecordManager::getActiveRecord($this->_Association->getModel(), $relatedRecord);
         } else {
             $relatedRecord = null;
         }
     }
     return array($relatedRecord);
 }
 public function associatedRecords(ActiveRecord $Record)
 {
     $record = $Record->getRecord();
     $Model = $Record->getModel();
     $RelatedRecord = false;
     // If the association has no condition, try first to find it in the pool
     if ($this->_Association->getDefinition('conditions')) {
         $RelatedRecord = ActiveRecordManager::findActiveRecordInPoolWithSecondaryKey($this->_Association->getModel(), $this->_Association->getDefinition('foreignKey'), $record[$Model->primaryKey]);
     }
     if ($RelatedRecord !== false) {
         return array($RelatedRecord);
     }
     if (!$Model->Behaviors->attached('Containable')) {
         $Model->Behaviors->load('Containable');
     }
     $result = $Model->find('first', array('conditions' => array($Model->alias . '.' . $Model->primaryKey => $record[$Model->primaryKey]), 'contain' => array($this->_Association->getName()), 'activeRecord' => false));
     if (!empty($result[$this->_Association->getName()][$this->_Association->getPrimaryKey()])) {
         $RelatedRecord = ActiveRecordManager::getActiveRecord($this->_Association->getModel(), $result[$this->_Association->getName()]);
     } else {
         $RelatedRecord = null;
     }
     return array($RelatedRecord);
 }
 public function removeAssociatedRecord(ActiveRecord $Record, $resetKeys = true)
 {
     $checked = false;
     $record =& $Record->getRecord();
     foreach ($this->_associated as $key => $AssociatedRecord) {
         $associatedRecord =& $AssociatedRecord->getRecord();
         if ($associatedRecord === $record) {
             $checked = true;
             break;
         }
     }
     if (!$checked) {
         return;
     }
     unset($this->_associated[$key]);
     $this->_AssociationStrategy->removeAssociatedRecord($Record);
     if ($resetKeys) {
         $this->_associated = array_values($this->_associated);
     }
     $this->_changed = true;
 }
 /**
  * if the record is associated with another record and this record 
  * not the same as referenced record: find this record, and remove the association
  * 
  * @see AssociationsTest::testCrossAssociation
  * 
  * @param ActiveRecord $Record
  * @param ActiveRecord $ReferenceRecord
  * @param string $foreignKey
  * @return void
  */
 protected function _removeOldAssociation(ActiveRecord $Record, ActiveRecord $ReferenceRecord, $foreignKey)
 {
     $foreignKeyValue = $Record->getRecord()[$foreignKey];
     if (empty($foreignKeyValue)) {
         return;
     }
     $AssociatedRecord = ActiveRecordManager::findActiveRecordInPool($this->_Association->getRecord()->getModel(), $foreignKeyValue);
     if (!$AssociatedRecord || $ReferenceRecord === $AssociatedRecord) {
         return;
     }
     $assoctiation = $AssociatedRecord->{$this->_Association->getName()};
     if ($assoctiation) {
         $assoctiation->remove($Record);
     }
 }