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