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