public static function loadFor($linkClass, DatabaseObject $for) { assert(class_exists($linkClass)); assert(is_subclass_of($linkClass, __CLASS__)); if (!isset($for->id)) { throw new InvalidArgumentException('unsaved DatabaseObject'); } $database = $for->getDatabase(); $meta = DatabaseObjectLinkMeta::forClass($linkClass, $for->_db); $data = array(); if (is_a($for, $meta->getFromClass())) { $sql = $meta->getSQL('link_load_from'); $data['from'] = $for; $other = 'to'; $otherClass = $meta->getToClass(); } elseif (is_a($for, $meta->getToClass())) { $sql = $meta->getSQL('link_load_to'); $data['to'] = $for; $other = 'from'; $otherClass = $meta->getFromClass(); } else { throw new InvalidArgumentException('invalid DatabaseObject, expecting a ' . $meta->getFromClass() . 'or a ' . $meta->getToClass()); } $otherId = null; $list = $database->execute($sql, $for->id); $list->bindColumn(1, $otherId); $i = 1; foreach (array_merge($meta->getAdditionalKey(), $meta->getAutomaticColumns()) as $column) { $data[$column] = null; $list->bindColumn(++$i, $data[$column]); } $r = array(); $call = array($linkClass, 'factory'); while ($list->fetch()) { $data[$other] = DatabaseObject::load($otherClass, $otherId); array_push($r, call_user_func($call, $data)); } return $r; }