Example #1
0
 /**
  * Returns a Record for a specific reference.
  * A DataSource can directly return the DataHash, so it doesn't have to be fetched.
  *
  * @param Record $record
  * @param string $attributeName The attribute it's being accessed on
  * @return Record
  */
 public function getReferenced($record, $attributeName)
 {
     if ($data = $record->getDirectly($attributeName)) {
         if (is_array($data)) {
             // If the data hash exists already, just return the Record with it.
             return $this->cacheAndReturn($record, $attributeName, $this->getForeignDao()->getRecordFromData($data));
         } elseif (is_int($data)) {
             // If data is an integer, it must be the id. So just get the record set with the data.
             return $this->cacheAndReturn($record, $attributeName, $this->getForeignDao()->getRecordFromData(array('id' => (int) $data), true, false, false));
         } elseif ($data instanceof Record) {
             // The record is cached. Just return it.
             return $data;
         } else {
             Log::warning(sprintf('The data hash for `%s` was set but incorrect.', $attributeName));
             return null;
         }
     } else {
         // Otherwise: get the data hash and return the Record.
         $localKey = $this->getLocalKey();
         $foreignKey = $this->getForeignKey();
         if ($localKey && $foreignKey) {
             $localValue = $record->get($localKey);
             if ($localValue === null) {
                 return null;
             }
             return $this->cacheAndReturn($record, $attributeName, $this->getForeignDao()->get(array($foreignKey => $localValue)));
         } else {
             return null;
         }
     }
 }
Example #2
0
 /**
  * Returns a DaoIterator for a specific reference.
  * A DataSource can directly return the DataHash, so it doesn't have to be fetched.
  *
  * @param Record $record
  * @param string $attribute The attribute it's being accessed on
  * @return DaoIterator
  */
 public function getReferenced($record, $attribute)
 {
     if ($data = $record->getDirectly($attribute)) {
         if (is_array($data)) {
             if (count($data) === 0 || is_array(reset($data))) {
                 // The data hash is an array, either empty, or containing the hashes.
                 return new DaoHashListIterator($data, $this->getForeignDao());
             } elseif (is_int(reset($data)) && ($foreignKey = $this->getForeignKey())) {
                 // The data hash is an array containing the ids, and there is a
                 // foreign key to link them to.
                 return new DaoKeyListIterator($data, $this->getForeignDao(), $foreignKey);
             }
         }
         Log::warning(sprintf('The data hash for `%s` was set but incorrect.', $attribute));
         return new DaoHashListIterator(array(), $this->getForeignDao());
     } else {
         // Get the list of ids
         $localKey = $this->getLocalKey();
         $foreignKey = $this->getForeignKey();
         if ($localKey && $foreignKey) {
             $localValue = $record->get($localKey);
             return new DaoKeyListIterator($localValue ? $localValue : array(), $this->getForeignDao(), $foreignKey);
         }
         return new DaoKeyListIterator(array(), $this->getForeignDao(), $foreignKey);
     }
 }
 /**
  * Returns a DaoIterator for a specific reference.
  * A DataSource can directly return the DataHash, so it doesn't have to be fetched.
  *
  * @param Record $record
  * @param string $attributeName The attribute it's being accessed on
  * @return DaoIterator
  */
 public function getReferenced($record, $attributeName)
 {
     if ($data = $record->getDirectly($attributeName)) {
         if (is_array($data)) {
             // If the data hash exists already, just return the Iterator with it.
             return $this->cacheAndReturn($record, $attributeName, $this->getForeignDao()->createIterator($data));
         } elseif ($data instanceof Iterator) {
             // The iterator is cached. Just return it.
             return $data;
         } else {
             Log::warning(sprintf('The data hash for `%s` was set but incorrect.', $attributeName));
             return null;
         }
     } else {
         return $this->cacheAndReturn($record, $attributeName, $this->getForeignDao()->getIterator($this->applyFilter(array($this->getForeignKey() => $record->get($this->getLocalKey())))));
     }
 }