1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
queryhelper.php
См. документацию.
1<?php
8
9namespace Bitrix\Main\ORM\Query;
10
11use Bitrix\Main\ORM\Objectify\Collection;
12use Bitrix\Main\ORM\Objectify\IdentityMap;
13use Bitrix\Main\ORM\Query\Filter\ConditionTree;
14
22{
34 public static function decompose(Query $query, $fairLimit = true, $separateRelations = true)
35 {
36 $entity = $query->getEntity();
37 $queryClass = $entity->getDataClass()::getQueryClass();
38 $runtimeChains = $query->getRuntimeChains() ?? [];
39 $primaryNames = $entity->getPrimaryArray();
40 $originalSelect = $query->getSelect();
41
42 if ($fairLimit)
43 {
44 // select distinct primary
45 $query->setSelect($entity->getPrimaryArray());
46 $query->setDistinct();
47
48 $rows = $query->fetchAll();
49
50 // return empty result
51 if (empty($rows))
52 {
53 return $query->getEntity()->createCollection();
54 }
55
56 // reset query
57 $query = new $queryClass($entity);
58 $query->setSelect($originalSelect);
59 $query->where(static::getPrimaryFilter($primaryNames, $rows));
60
61 foreach ($runtimeChains as $chain)
62 {
63 $query->registerChain('runtime', $chain);
64 }
65 }
66
67 // more than one OneToMany or ManyToMany
68 if ($separateRelations)
69 {
70 $commonSelect = [];
71 $dividedSelect = [];
72
73 foreach ($originalSelect as $selectItem)
74 {
75 // init query with select item
76 $selQuery = new $queryClass($entity);
77 $selQuery->addSelect($selectItem);
78 $selQuery->getQuery(true);
79
80 // check for relations
81 foreach ($selQuery->getChains() as $chain)
82 {
83 if ($chain->hasBackReference())
84 {
85 $dividedSelect[] = $selectItem;
86 continue 2;
87 }
88 }
89
90 $commonSelect[] = $selectItem;
91 }
92
93 if (empty($commonSelect))
94 {
95 $commonSelect = $query->getEntity()->getPrimaryArray();
96 }
97
98 // common query
99 $query->setSelect($commonSelect);
100 }
101
103 $collection = $query->fetchCollection();
104
105 // original sort
106 if (!empty($rows))
107 {
108 $sortedCollection = $query->getEntity()->createCollection();
109
110 foreach ($rows as $row)
111 {
112 $sortedCollection->add($collection->getByPrimary($row));
113 }
114
115 $collection = $sortedCollection;
116 }
117
118 if (!empty($dividedSelect) && $collection->count())
119 {
120 // custom identity map & collect primaries
121 $im = new IdentityMap;
122 $primaryValues = [];
123
124 foreach ($collection as $object)
125 {
126 $im->put($object);
127
128 $primaryValues[] = $object->primary;
129 }
130
131 $primaryFilter = static::getPrimaryFilter($primaryNames, $primaryValues);
132
133 // select relations
134 foreach ($dividedSelect as $selectItem)
135 {
136 $relQuery = (new $queryClass($entity))
137 ->addSelect($selectItem)
138 ->where($primaryFilter);
139
140 foreach ($runtimeChains as $chain)
141 {
142 $relQuery->registerChain('runtime', $chain);
143 }
144
145 $result = $relQuery->exec();
146
147 $result->setIdentityMap($im);
148 $result->fetchCollection();
149 }
150 }
151
152 return $collection;
153 }
154
161 public static function getPrimaryFilter($primaryNames, $primaryValues)
162 {
163 $commonSubFilter = new ConditionTree();
164
165 if (count($primaryNames) === 1)
166 {
167 $values = [];
168
169 foreach ($primaryValues as $row)
170 {
171 $values[] = $row[$primaryNames[0]];
172 }
173
174 $commonSubFilter->whereIn($primaryNames[0], $values);
175 }
176 else
177 {
178 $commonSubFilter->logic('or');
179
180 foreach ($primaryValues as $row)
181 {
182 $primarySubFilter = new ConditionTree();
183
184 foreach ($primaryNames as $primaryName)
185 {
186 $primarySubFilter->where($primaryName, $row[$primaryName]);
187 }
188 }
189 }
190
191 return $commonSubFilter;
192 }
193}
static getPrimaryFilter($primaryNames, $primaryValues)
Определения queryhelper.php:161
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
$entity
Определения chain.php:3
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$rows
Определения options.php:264