public static function load($parent, $childs, $keyField, array $ids, $foreignKey = null) { self::parseItemStatement($parent, $parentItemName, $parentFields); Lms_Item::initStructure(Lms_Item::getClassName($parentItemName)); $struct = Lms_Item::getStruct($parentItemName); if (count($parentFields)) { if ($foreignKey && !in_array($foreignKey, $parentFields)) { array_unshift($parentFields, $foreignKey); } foreach ($struct->getPk() as $fieldName) { if (!in_array($fieldName, $parentFields)) { array_unshift($parentFields, $fieldName); } } } if (!$foreignKey && $struct->hasIndex($keyField)) { $foreignKey = $keyField; } $newScalarPKs = self::_exec($parentItemName, $parentFields, $keyField, $ids, $foreignKey); foreach ($childs as $child) { self::parseItemStatement($child, $childItemName, $childFields); Lms_Item::initStructure(Lms_Item::getClassName($childItemName)); $relation = Lms_Item_Relations::get($parentItemName, $childItemName); if (!$relation) { $linkatorItemName = Lms_Item::getLinkator($parentItemName, $childItemName); $subRelation = Lms_Item_Relations::get($parentItemName, $linkatorItemName); $newKeys = array_unique(Lms_Item_Store::getAllFieldValues($newScalarPKs, Lms_Item::getTableName($parentItemName), $subRelation['parent_key'])); self::load($linkatorItemName, array($child), $subRelation['foreign_key'], $newKeys, $subRelation['foreign_key']); } else { if (count($childFields)) { if ($relation && !in_array($relation['foreign_key'], $childFields)) { array_unshift($childFields, $relation['foreign_key']); } $struct = Lms_Item::getStruct($childItemName); foreach ($struct->getPk() as $fieldName) { if (!in_array($fieldName, $childFields)) { array_unshift($childFields, $fieldName); } } } $newKeys = array_unique(Lms_Item_Store::getAllFieldValues($newScalarPKs, Lms_Item::getTableName($parentItemName), $relation['parent_key'])); self::_exec($childItemName, $childFields, $relation['foreign_key'], $newKeys, $relation['foreign_key']); } } }
/** * Загружает зависимости $subItemName для данной сущности * @param $subItemName * return bool */ function loadRelated($subItemName, $fk = null) { if (method_exists($this, "load{$subItemName}")) { return call_user_func(array($this, "load{$subItemName}")); } else { $tableName = Lms_Item::getTableName($subItemName); if ($fk === null) { $fk = $this->_getSimplePk(); } $fkValue = $this->__getValue($fk); $rows = $this->_slaveDb->select("SELECT * FROM {$tableName} WHERE ?#=?", $fk, $fkValue); if ($rows) { $subItemPk = Lms_Item::getStruct($subItemName)->getPk(); foreach ($rows as $row) { $scalarPkValue = Lms_Item_Scalar::extractScalarPkValue($row, $subItemPk); Lms_Item_Store::setValues($tableName, $scalarPkValue, $row, true); } Lms_Item_Store::rebuildIndex($tableName); } } }
public static function initStructure($className) { if (!isset(self::$_initedClasses[$className])) { $struct = Lms_Item::getStruct(self::getItemName($className)); /** * @todo инициализировать связи (relations) только один раз, * основываясь на имени класса объекта, а не на имени таблицы, * так как Cover, Poster, Screenshot имееют одну и ту же * таблицу images */ call_user_func(array($className, 'initRelations'), $className); $itemName = self::getItemName($className); call_user_func(array($className, '_customInitStructure'), $struct, self::getMasterDb($itemName), self::getSlaveDb($itemName)); self::$_initedClasses[$className] = true; } }