| @@ 681-721 (lines=41) @@ | ||
| 678 | * @param object $document |
|
| 679 | * @return Expr |
|
| 680 | */ |
|
| 681 | public function includesReferenceTo($document) |
|
| 682 | { |
|
| 683 | $this->requiresCurrentField(); |
|
| 684 | $mapping = $this->getReferenceMapping(); |
|
| 685 | $reference = $this->dm->createReference($document, $mapping); |
|
| 686 | $storeAs = array_key_exists('storeAs', $mapping) ? $mapping['storeAs'] : null; |
|
| 687 | $keys = []; |
|
| 688 | ||
| 689 | switch ($storeAs) { |
|
| 690 | case ClassMetadata::REFERENCE_STORE_AS_ID: |
|
| 691 | $this->query[$mapping['name']] = $reference; |
|
| 692 | return $this; |
|
| 693 | break; |
|
| 694 | ||
| 695 | case ClassMetadata::REFERENCE_STORE_AS_REF: |
|
| 696 | $keys = ['id' => true]; |
|
| 697 | break; |
|
| 698 | ||
| 699 | case ClassMetadata::REFERENCE_STORE_AS_DB_REF: |
|
| 700 | case ClassMetadata::REFERENCE_STORE_AS_DB_REF_WITH_DB: |
|
| 701 | $keys = ['$ref' => true, '$id' => true, '$db' => true]; |
|
| 702 | ||
| 703 | if ($storeAs === ClassMetadata::REFERENCE_STORE_AS_DB_REF) { |
|
| 704 | unset($keys['$db']); |
|
| 705 | } |
|
| 706 | ||
| 707 | if (isset($mapping['targetDocument'])) { |
|
| 708 | unset($keys['$ref'], $keys['$db']); |
|
| 709 | } |
|
| 710 | break; |
|
| 711 | ||
| 712 | default: |
|
| 713 | throw new \InvalidArgumentException("Reference type {$storeAs} is invalid."); |
|
| 714 | } |
|
| 715 | ||
| 716 | foreach ($keys as $key => $value) { |
|
| 717 | $this->query[$mapping['name']]['$elemMatch'][$key] = $reference[$key]; |
|
| 718 | } |
|
| 719 | ||
| 720 | return $this; |
|
| 721 | } |
|
| 722 | ||
| 723 | /** |
|
| 724 | * Set the $language option for $text criteria. |
|
| @@ 1079-1119 (lines=41) @@ | ||
| 1076 | * @param object $document |
|
| 1077 | * @return Expr |
|
| 1078 | */ |
|
| 1079 | public function references($document) |
|
| 1080 | { |
|
| 1081 | $this->requiresCurrentField(); |
|
| 1082 | $mapping = $this->getReferenceMapping(); |
|
| 1083 | $reference = $this->dm->createReference($document, $mapping); |
|
| 1084 | $storeAs = array_key_exists('storeAs', $mapping) ? $mapping['storeAs'] : null; |
|
| 1085 | $keys = []; |
|
| 1086 | ||
| 1087 | switch ($storeAs) { |
|
| 1088 | case ClassMetadata::REFERENCE_STORE_AS_ID: |
|
| 1089 | $this->query[$mapping['name']] = $reference; |
|
| 1090 | return $this; |
|
| 1091 | break; |
|
| 1092 | ||
| 1093 | case ClassMetadata::REFERENCE_STORE_AS_REF: |
|
| 1094 | $keys = ['id' => true]; |
|
| 1095 | break; |
|
| 1096 | ||
| 1097 | case ClassMetadata::REFERENCE_STORE_AS_DB_REF: |
|
| 1098 | case ClassMetadata::REFERENCE_STORE_AS_DB_REF_WITH_DB: |
|
| 1099 | $keys = ['$ref' => true, '$id' => true, '$db' => true]; |
|
| 1100 | ||
| 1101 | if ($storeAs === ClassMetadata::REFERENCE_STORE_AS_DB_REF) { |
|
| 1102 | unset($keys['$db']); |
|
| 1103 | } |
|
| 1104 | ||
| 1105 | if (isset($mapping['targetDocument'])) { |
|
| 1106 | unset($keys['$ref'], $keys['$db']); |
|
| 1107 | } |
|
| 1108 | break; |
|
| 1109 | ||
| 1110 | default: |
|
| 1111 | throw new \InvalidArgumentException("Reference type {$storeAs} is invalid."); |
|
| 1112 | } |
|
| 1113 | ||
| 1114 | foreach ($keys as $key => $value) { |
|
| 1115 | $this->query[$mapping['name'] . '.' . $key] = $reference[$key]; |
|
| 1116 | } |
|
| 1117 | ||
| 1118 | return $this; |
|
| 1119 | } |
|
| 1120 | ||
| 1121 | /** |
|
| 1122 | * Rename the current field. |
|