/** * Updates references between owner and referenced record collection * * @param RecordCollection|Record[] $ownerCollection * @param RecordCollection|Record[] $referencedCollection */ public function updateOwnerCollectionWithReferencedCollection(RecordCollection $ownerCollection, RecordCollection $referencedCollection) { $owningField = $this->relation->getOwningField(); $isOneToMany = $this->relation->isOneToMany(); foreach ($ownerCollection as $refRecord) { $refId = $refRecord->get($owningField); $owningId = $refRecord->getInternalId(); $this->assignReference($refId, $owningId); } foreach ($referencedCollection as $refRecord) { $id = $refRecord->getInternalId(); if (!$this->isReferenced($id) && !$this->hasNullReference($id)) { $reference = $isOneToMany ? array() : null; $this->setReference($id, $reference); } } }
/** * @param Relation $relation * @param string $relationName * @param bool $withMappedFields * @param array $visited * @return array|bool */ private function getReferenceAsArray(Relation $relation, $relationName, $withMappedFields, array &$visited) { if (!$relation->hasReferenceLoadedFor($this, $relationName)) { return false; } /** @var Record|Record[]|RecordCollection $related */ $related = $this->get($relationName); if ($relation->isOneToMany() && $relation->isOwningSide($relationName)) { $reference = array(); foreach ($related as $relatedRecord) { $reference[] = $relatedRecord->toArray(true, $withMappedFields, $visited); } return $reference; } return $related->toArray(true, $withMappedFields, $visited); }
/** * Saves records related for referenced relation * * @param Relation $relation * @param array|string $relatedRows * @param string $id */ private function saveRecordsOnOwningRelation(Relation $relation, $relatedRows, $id) { $owningTable = $relation->getOwningTable(); $owningField = $relation->getOwningField(); if ($relation->isOneToMany()) { foreach ($relatedRows as $relatedKey => $relatedRow) { $this->saveRecordOnOwningRelation($relatedRow, $owningTable, $owningField, $id, $relatedKey); } } else { $this->saveRecordOnOwningRelation($relatedRows, $owningTable, $owningField, $id); } }