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); } }