| @@ 695-735 (lines=41) @@ | ||
| 692 | * @param object $document |
|
| 693 | * @return Expr |
|
| 694 | */ |
|
| 695 | public function includesReferenceTo($document) |
|
| 696 | { |
|
| 697 | $this->requiresCurrentField(); |
|
| 698 | $mapping = $this->getReferenceMapping(); |
|
| 699 | $reference = $this->dm->createReference($document, $mapping); |
|
| 700 | $storeAs = array_key_exists('storeAs', $mapping) ? $mapping['storeAs'] : null; |
|
| 701 | $keys = []; |
|
| 702 | ||
| 703 | switch ($storeAs) { |
|
| 704 | case ClassMetadata::REFERENCE_STORE_AS_ID: |
|
| 705 | $this->query[$mapping['name']] = $reference; |
|
| 706 | return $this; |
|
| 707 | break; |
|
| 708 | ||
| 709 | case ClassMetadata::REFERENCE_STORE_AS_REF: |
|
| 710 | $keys = ['id' => true]; |
|
| 711 | break; |
|
| 712 | ||
| 713 | case ClassMetadata::REFERENCE_STORE_AS_DB_REF: |
|
| 714 | case ClassMetadata::REFERENCE_STORE_AS_DB_REF_WITH_DB: |
|
| 715 | $keys = ['$ref' => true, '$id' => true, '$db' => true]; |
|
| 716 | ||
| 717 | if ($storeAs === ClassMetadata::REFERENCE_STORE_AS_DB_REF) { |
|
| 718 | unset($keys['$db']); |
|
| 719 | } |
|
| 720 | ||
| 721 | if (isset($mapping['targetDocument'])) { |
|
| 722 | unset($keys['$ref'], $keys['$db']); |
|
| 723 | } |
|
| 724 | break; |
|
| 725 | ||
| 726 | default: |
|
| 727 | throw new \InvalidArgumentException("Reference type {$storeAs} is invalid."); |
|
| 728 | } |
|
| 729 | ||
| 730 | foreach ($keys as $key => $value) { |
|
| 731 | $this->query[$mapping['name']]['$elemMatch'][$key] = $reference[$key]; |
|
| 732 | } |
|
| 733 | ||
| 734 | return $this; |
|
| 735 | } |
|
| 736 | ||
| 737 | /** |
|
| 738 | * Set the $language option for $text criteria. |
|
| @@ 1093-1133 (lines=41) @@ | ||
| 1090 | * @param object $document |
|
| 1091 | * @return Expr |
|
| 1092 | */ |
|
| 1093 | public function references($document) |
|
| 1094 | { |
|
| 1095 | $this->requiresCurrentField(); |
|
| 1096 | $mapping = $this->getReferenceMapping(); |
|
| 1097 | $reference = $this->dm->createReference($document, $mapping); |
|
| 1098 | $storeAs = array_key_exists('storeAs', $mapping) ? $mapping['storeAs'] : null; |
|
| 1099 | $keys = []; |
|
| 1100 | ||
| 1101 | switch ($storeAs) { |
|
| 1102 | case ClassMetadata::REFERENCE_STORE_AS_ID: |
|
| 1103 | $this->query[$mapping['name']] = $reference; |
|
| 1104 | return $this; |
|
| 1105 | break; |
|
| 1106 | ||
| 1107 | case ClassMetadata::REFERENCE_STORE_AS_REF: |
|
| 1108 | $keys = ['id' => true]; |
|
| 1109 | break; |
|
| 1110 | ||
| 1111 | case ClassMetadata::REFERENCE_STORE_AS_DB_REF: |
|
| 1112 | case ClassMetadata::REFERENCE_STORE_AS_DB_REF_WITH_DB: |
|
| 1113 | $keys = ['$ref' => true, '$id' => true, '$db' => true]; |
|
| 1114 | ||
| 1115 | if ($storeAs === ClassMetadata::REFERENCE_STORE_AS_DB_REF) { |
|
| 1116 | unset($keys['$db']); |
|
| 1117 | } |
|
| 1118 | ||
| 1119 | if (isset($mapping['targetDocument'])) { |
|
| 1120 | unset($keys['$ref'], $keys['$db']); |
|
| 1121 | } |
|
| 1122 | break; |
|
| 1123 | ||
| 1124 | default: |
|
| 1125 | throw new \InvalidArgumentException("Reference type {$storeAs} is invalid."); |
|
| 1126 | } |
|
| 1127 | ||
| 1128 | foreach ($keys as $key => $value) { |
|
| 1129 | $this->query[$mapping['name'] . '.' . $key] = $reference[$key]; |
|
| 1130 | } |
|
| 1131 | ||
| 1132 | return $this; |
|
| 1133 | } |
|
| 1134 | ||
| 1135 | /** |
|
| 1136 | * Rename the current field. |
|