示例#1
0
文件: Storage.php 项目: cti/sencha
 protected function saveLinks(Master $master, $model, $pk, $data)
 {
     $schema = $this->schema;
     $data = get_object_vars($data);
     unset($pk['v_end']);
     $makeKey = function ($fields, $data) {
         $items = array();
         foreach ($fields as $field) {
             $items[] = $data[$field];
         }
         return implode(':', $items);
     };
     $convertPkForModel = function ($linkName, $pk) use($schema, $model) {
         $linkModel = $schema->getModel($linkName);
         $parentModel = $schema->getModel($model);
         $reference = $linkModel->getOutReference($parentModel->getName());
         $properties = $reference->getProperties();
         foreach ($properties as $property) {
             foreach ($pk as $key => $value) {
                 if ($key == $property->getForeignName()) {
                     unset($pk[$key]);
                     $pk[$property->getName()] = $value;
                 }
             }
         }
         return $pk;
     };
     foreach ($data as $linkName => $records) {
         $linkPk = $schema->getModel($linkName)->getPk();
         unset($linkPk[array_search('v_end', $linkPk)]);
         $repository = $master->getRepository($linkName);
         $existingLinks = $repository->findAll($convertPkForModel($linkName, $pk));
         $hash = array();
         foreach ($existingLinks as $existingLink) {
             $key = $makeKey($linkPk, $existingLink->asArray());
             $hash[$key] = $existingLink;
         }
         foreach ($records as $record) {
             $record = get_object_vars($record);
             $key = $makeKey($linkPk, $record);
             if (isset($hash[$key])) {
                 $existingLink = $hash[$key];
                 $existingLink->merge($record);
                 unset($hash[$key]);
             } else {
                 $existingLink = $repository->create($record);
             }
             $existingLink->save();
         }
         foreach ($hash as $key => $record) {
             $record->delete();
         }
     }
 }