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 afterFind(Model $Model, $results, $primary = false) { $records = $results; if ($this->runtime[$Model->alias]['activeRecord']) { if ($Model->findQueryType == 'first') { // The afterFind callback is called before that the find method refines the result to 1 row. if (count($results) > 0) { $records = array(ActiveRecordManager::getActiveRecord($Model, $results[0])); } else { $records = array(); } } elseif ($Model->findQueryType == 'all') { $records = array(); foreach ($results as $result) { $records[] = ActiveRecordManager::getActiveRecord($Model, $result); } } } return $records; }
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 refresh($records) { if ($this->_initialized) { if ($this->isBelongsTo() || $this->isHasOne()) { if (count($this->_associated) === 1) { $this->_associated[0]->refresh($records); } else { $this->_associated = array(ActiveRecordManager::getActiveRecord($this->_Model, $records)); } } else { $oldRecords = array(); foreach ($this->_associated as $Record) { $oldRecords[$Record->{$this->getPrimaryKey()}] = $Record; } $result = array(); foreach ($records as $record) { if (array_key_exists($record[$this->getPrimaryKey()], $oldRecords)) { $result[] = $Record->refresh($record); } else { $result[] = ActiveRecordManager::getActiveRecord($this->_Model, $record); } } $this->_associated = $result; } } else { $this->_initializeWithRecord($records); } $this->_changed = false; }
public function associatedRecords(ActiveRecord $Record) { $referenceRecord = $Record->getRecord(); $referenceModel = $Record->getModel(); $relatedRecords = array(); if (isset($referenceRecord[$referenceModel->primaryKey])) { if (!$referenceModel->Behaviors->attached('Containable')) { $referenceModel->Behaviors->load('Containable'); } // We can never be sure that all records are stored in the pool. So we must query them. $result = $referenceModel->find('first', array('conditions' => array($referenceModel->alias . '.' . $referenceModel->primaryKey => $referenceRecord[$referenceModel->primaryKey]), 'contain' => array($this->_Association->getName()), 'activeRecord' => false)); if (!$result) { return $relatedRecords; } foreach ($result[$this->_Association->getName()] as $relatedRecord) { $relatedRecords[] = ActiveRecordManager::getActiveRecord($this->_Association->getModel(), $relatedRecord); } } return $relatedRecords; }