Bitrix-D7  20.5.0
Класс Query
Граф наследования:Query:
Query Query EventOfflineQuery AliasedQuery OrderQuery OrderPropertyValuesQuery OrderQueryLocation

Открытые члены

 __construct ($source)
 
 __call ($method, $arguments)
 
 getSelect ()
 Returns an array of fields for SELECT clause. Подробнее...
 
 setSelect (array $select)
 Sets a list of fields for SELECT clause. Подробнее...
 
 addSelect ($definition, $alias='')
 Adds a field for SELECT clause. Подробнее...
 
 getFilter ()
 Returns an array of filters for WHERE clause. Подробнее...
 
 setFilter (array $filter)
 Sets a list of filters for WHERE clause. Подробнее...
 
 addFilter ($key, $value)
 Adds a filter for WHERE clause. Подробнее...
 
 getFilterHandler ()
 
 getGroup ()
 Returns an array of fields for GROUP BY clause. Подробнее...
 
 setGroup ($group)
 Sets a list of fields in GROUP BY clause. Подробнее...
 
 addGroup ($group)
 Adds a field to the list of fields for GROUP BY clause. Подробнее...
 
 getOrder ()
 Returns an array of fields for ORDER BY clause. Подробнее...
 
 setOrder ($order)
 Sets a list of fields for ORDER BY clause. Подробнее...
 
 addOrder ($definition, $order='ASC')
 Adds a filed to the list of fields for ORDER BY clause. Подробнее...
 
 getLimit ()
 Returns a limit. Подробнее...
 
 setLimit ($limit)
 Sets a limit for LIMIT n clause. Подробнее...
 
 getOffset ()
 Returns an offset. Подробнее...
 
 setOffset ($offset)
 Sets an offset for LIMIT n, m clause. Подробнее...
 
 countTotal ($count=null)
 
 union ()
 Puts additional query to union with current. Подробнее...
 
 unionAll ()
 Puts additional query to union (all) with current. Подробнее...
 
 setUnionOrder ($order)
 General order for all the union queries. Подробнее...
 
 addUnionOrder ($definition, $order='ASC')
 General order for all the union queries. Подробнее...
 
 setUnionLimit ($limit)
 General limit for all the union queries. Подробнее...
 
 setUnionOffset ($offset)
 General offset for all the union queries. Подробнее...
 
 enableDataDoubling ()
 
 disableDataDoubling ()
 Replaces all 1:N relations in filter to ID IN (subquery SELECT ID FROM <1:N relation>) Available for Entities with 1 primary field only. Подробнее...
 
 enablePrivateFields ()
 Allows private fields in query. Подробнее...
 
 disablePrivateFields ()
 Restricts private fields in query. Подробнее...
 
 isPrivateFieldsEnabled ()
 
 registerRuntimeField ($name, $fieldInfo=null)
 Adds a runtime field (being created dynamically, opposite to being described statically in the entity map) Подробнее...
 
 setTableAliasPostfix ($postfix)
 
 getTableAliasPostfix ()
 
 setCustomBaseTableAlias ($alias)
 Sets a custom alias for the table of the init entity. Подробнее...
 
 exec ()
 Builds and executes the query and returns the result. Подробнее...
 
 fetch (\Bitrix\Main\Text\Converter $converter=null)
 Short alias for $result->fetch() Подробнее...
 
 fetchAll (\Bitrix\Main\Text\Converter $converter=null)
 Short alias for $result->fetchAll() Подробнее...
 
 fetchObject ()
 Short alias for $result->fetchObject() Подробнее...
 
 fetchCollection ()
 Short alias for $result->fetchCollection() Подробнее...
 
 setFilterChains (&$filter, $section='filter')
 
 setFilterHandlerChains (Filter $where, $section='filter')
 
 hasAggregation ()
 
 setDistinct ($distinct=true)
 
 hasDistinct ()
 
 registerChain ($section, Chain $chain, $opt_key=null)
 
 getRegisteredChain ($key, $force_create=false)
 
 booleanStrongEqualityCallback ($field, $operation, $value)
 
 nullEqualityCallback ($field, $operation, $value)
 
 dataDoublingCallback ($field, $operation, $value)
 
 queryCountTotal ()
 
 fetchDataModificationCallback (&$data)
 Being called in Db\Result as a data fetch modifier. Подробнее...
 
 isFetchModificationRequired ()
 Check if fetch data modification required, also caches modifier-callbacks. Подробнее...
 
 quoteTableSource ($source)
 
 __clone ()
 
 hasBackReference ()
 
 getChains ()
 
 getGroupChains ()
 
 getHiddenChains ()
 
 getHavingChains ()
 
 getFilterChains ()
 
 getOrderChains ()
 
 getSelectChains ()
 
 getWhereChains ()
 
 getRuntimeChains ()
 
 getJoinMap ()
 
 getQuery ($forceObjectPrimary=false)
 Builds and returns SQL query string. Подробнее...
 
 getEntity ()
 
 getInitAlias ($withPostfix=true)
 
 getReplacedAliases ()
 
 setCacheTtl ($ttl)
 
 cacheJoins ($mode)
 Enables or disables caching of queries with joins. Подробнее...
 
 dump ()
 

Открытые статические члены

static isFieldPrivate ($field)
 
static filter ()
 Returns new instance of Filter. Подробнее...
 
static expr ()
 Used to create ExpressionField in a short way. Подробнее...
 
static getLastQuery ()
 Returns last executed query string. Подробнее...
 
static buildFilterSql (Entity $entity, $filter)
 Builds SQL filter conditions for WHERE. Подробнее...
 

Поля данных

 $group = array()
 
 $order = array()
 
 $limit = null
 
 $offset = null
 
 $countTotal = null
 
 $where = array()
 
 $having = array()
 
 $group_chains = array()
 
 $order_chains = array()
 
 $where_chains = array()
 
 $having_chains = array()
 
 $having_expr_chains = array()
 
 $hidden_chains = array()
 
 $cacheJoins = false
 

Защищенные члены

 checkForPrivateFields ()
 
 ensurePrimarySelect ()
 
 addToSelectChain ($definition, $alias=null)
 
 divideFilter ()
 
 divideFilterHandler ()
 
 checkFilterAggregation ($filter)
 
 checkFilterHandlerAggregation (Filter $filter)
 
 rewriteDataDoubling (Filter $filter, $section)
 
 addToGroupChain ($definition)
 
 addToOrderChain ($definition)
 
 buildJoinMap ($chains=null)
 
 buildSelect ()
 
 buildJoin ()
 
 buildWhere ()
 
 buildGroup ()
 
 buildHaving ()
 
 buildOrder ()
 
 buildQuery ($forceObjectPrimary=true)
 
 getFilterCswFields (&$filter)
 
 prepareJoinReference ($reference, $alias_this, $alias_ref, $baseDefinition, $refDefinition, $isBackReference)
 
 prepareJoinFilterReference (Filter $reference, $alias_this, $alias_ref, $baseDefinition, $refDefinition, $isBackReference, $firstCall=true)
 
 getJoinCswFields ($reference)
 
 checkChainsAggregation ($chain)
 
 checkChainsDistinct ($chain)
 
 collectExprChains (Chain $chain, $storages=array('hidden'))
 The most magic method. Подробнее...
 
 getUnionHandler ()
 
 getUniqueAlias ()
 
 query ($query)
 
 replaceSelectAliases ($query)
 

Защищенные данные

 $entity
 
 $select = array()
 
 $filter = array()
 
 $filterHandler
 
 $whereHandler
 
 $havingHandler
 
 $select_chains = array()
 
 $filter_chains = array()
 
 $select_expr_chains = array()
 
 $forcedObjectPrimaryFields
 
 $runtime_chains
 
 $global_chains = array()
 
 $query_build_parts
 
 $data_doubling_off = false
 
 $private_fields_on = false
 
 $table_alias_postfix = ''
 
 $custom_base_table_alias = null
 
 $join_map = array()
 
 $join_registry
 
 $unionHandler
 
 $is_distinct = false
 
 $is_executing = false
 
 $replaced_aliases
 
 $replaced_taliases
 
 $uniqueAliasCounter = 0
 
 $selectFetchModifiers = array()
 
 $cacheTtl = 0
 

Статические защищенные данные

static $expressionHelper
 
static $last_query
 

Подробное описание

См. определение в файле main/lib/orm/query/query.php строка 114

Конструктор(ы)

◆ __construct()

__construct (   $source)
Аргументы
Entity | Query | string$source
Исключения
Main

Переопределяется в AliasedQuery.

См. определение в файле main/lib/orm/query/query.php строка 244

245  {
246  if ($source instanceof $this)
247  {
248  $this->entity = Entity::getInstanceByQuery($source);
249  }
250  elseif ($source instanceof Entity)
251  {
252  $this->entity = clone $source;
253  }
254  elseif (is_string($source))
255  {
256  $this->entity = clone Entity::getInstance($source);
257  }
258  else
259  {
260  throw new Main\ArgumentException(sprintf(
261  'Unknown source type "%s" for new %s', gettype($source), __CLASS__
262  ));
263  }
264 
265  $this->filterHandler = static::filter();
266  $this->whereHandler = static::filter();
267  $this->havingHandler = static::filter();
268  }
static getInstance($entityName)
static getInstanceByQuery(Query $query, &$entity_name=null)

Методы

◆ __call()

__call (   $method,
  $arguments 
)
Аргументы
$method
$arguments
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 277

278  {
279  // where and having proxies
280  if (substr($method, 0, 6) === 'having')
281  {
282  $method = str_replace('having', 'where', $method);
283  }
284 
285  if (substr($method, 0, 5) === 'where')
286  {
287  if (method_exists($this->filterHandler, $method))
288  {
289  call_user_func_array(
290  [$this->filterHandler, $method],
291  $arguments
292  );
293 
294  return $this;
295  }
296  }
297 
298  if (substr($method, 0, 4) === 'with')
299  {
300  $dataClass = $this->entity->getDataClass();
301 
302  if (method_exists($dataClass, $method))
303  {
304  // set query as first element
305  array_unshift($arguments, $this);
306 
307  call_user_func_array(
308  [$dataClass, $method],
309  $arguments
310  );
311 
312  return $this;
313  }
314  }
315 
316  throw new Main\SystemException("Unknown method `{$method}`");
317  }

◆ __clone()

__clone ( )

См. определение в файле main/lib/orm/query/query.php строка 3693

3694  {
3695  $this->entity = clone $this->entity;
3696 
3697  $this->filterHandler = clone $this->filterHandler;
3698  $this->whereHandler = clone $this->whereHandler;
3699  $this->havingHandler = clone $this->havingHandler;
3700 
3701  foreach ($this->select as $k => $v)
3702  {
3703  if ($v instanceof ExpressionField)
3704  {
3705  $this->select[$k] = clone $v;
3706  }
3707  }
3708  }

◆ addFilter()

addFilter (   $key,
  $value 
)

Adds a filter for WHERE clause.

Аргументы
string$key
mixed$value
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 391

392  {
393  if (is_null($key) && is_array($value))
394  {
395  $this->filter[] = $value;
396  }
397  else
398  {
399  $this->filter[$key] = $value;
400  }
401 
402  return $this;
403  }
static filter()
Returns new instance of Filter.

◆ addGroup()

addGroup (   $group)

Adds a field to the list of fields for GROUP BY clause.

Аргументы
$group
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 443

444  {
445  $this->group[] = $group;
446  return $this;
447  }

◆ addOrder()

addOrder (   $definition,
  $order = 'ASC' 
)

Adds a filed to the list of fields for ORDER BY clause.

Аргументы
string$definition
string$order
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 505

506  {
507  $order = strtoupper($order);
508 
509  if (!in_array($order, array('ASC', 'DESC'), true))
510  {
511  throw new Main\ArgumentException(sprintf('Invalid order "%s"', $order));
512  }
513 
514  $connection = $this->entity->getConnection();
515  $helper = $connection->getSqlHelper();
516 
517  if ($order == 'ASC')
518  {
519  $order = $helper->getAscendingOrder();
520  }
521  else
522  {
523  $order = $helper->getDescendingOrder();
524  }
525 
526  $this->order[$definition] = $order;
527 
528  return $this;
529  }

◆ addSelect()

addSelect (   $definition,
  $alias = '' 
)

Adds a field for SELECT clause.

Аргументы
mixed$definitionField
string$aliasField alias like SELECT field AS alias
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 348

349  {
350  if($alias <> '')
351  {
352  $this->select[$alias] = $definition;
353  }
354  else
355  {
356  $this->select[] = $definition;
357  }
358 
359  return $this;
360  }

◆ addToGroupChain()

addToGroupChain (   $definition)
protected
Аргументы
$definition
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1851

1852  {
1853  $chain = $this->getRegisteredChain($definition, true);
1854  $this->registerChain('group', $chain);
1855 
1856  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
1857  {
1858  $this->collectExprChains($chain);
1859  }
1860  }
registerChain($section, Chain $chain, $opt_key=null)
collectExprChains(Chain $chain, $storages=array('hidden'))
The most magic method.
getRegisteredChain($key, $force_create=false)

◆ addToOrderChain()

addToOrderChain (   $definition)
protected
Аргументы
$definition
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1867

1868  {
1869  $chain = $this->getRegisteredChain($definition, true);
1870  $this->registerChain('order', $chain);
1871 
1872  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
1873  {
1874  $this->collectExprChains($chain);
1875  }
1876  }

◆ addToSelectChain()

addToSelectChain (   $definition,
  $alias = null 
)
protected
Аргументы
$definition
null$alias
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1081

1082  {
1083  if ($definition instanceof ExpressionField)
1084  {
1085  if (empty($alias))
1086  {
1087  $alias = $definition->getName();
1088  }
1089 
1090  $this->registerRuntimeField($alias, $definition);
1091  $chain = $this->getRegisteredChain($alias);
1092 
1093  // add
1094  $this->registerChain('select', $chain);
1095 
1096  // recursively collect all "build_from" fields
1097  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
1098  {
1099  $this->collectExprChains($chain, array('hidden', 'select_expr'));
1100  }
1101  }
1102  elseif (is_array($definition))
1103  {
1104  // it is runtime field
1105  // now they are @deprecated in here
1106  throw new Main\ArgumentException(
1107  'Expression as an array in `select` section is no more supported due to security reason.'
1108  .' Please use `runtime` parameter, or Query->registerRuntimeField method, or pass ExpressionField object instead of array.'
1109  );
1110  }
1111  else
1112  {
1113  // localize definition (get last field segment e.g. NAME from REF1.REF2.NAME)
1114  $localDefinitionPos = strrpos($definition, '.');
1115 
1116  if ($localDefinitionPos !== false)
1117  {
1118  $localDefinition = substr($definition, $localDefinitionPos + 1);
1119  $localEntityDef = substr($definition, 0, $localDefinitionPos);
1120  $localChain = Chain::getChainByDefinition($this->entity, $localEntityDef.'.*');
1121  $lastElemValue = $localChain->getLastElement()->getValue();
1122 
1123  if ($lastElemValue instanceof Reference)
1124  {
1125  $localEntity = $lastElemValue->getRefEntity();
1126  }
1127  elseif (is_array($lastElemValue))
1128  {
1129  list($localEntity, ) = $lastElemValue;
1130  }
1131  else
1132  {
1133  $localEntity = $lastElemValue;
1134  }
1135  }
1136  else
1137  {
1138  $localDefinition = $definition;
1139  $localEntityDef = "";
1140  $dataClass = $this->entity->getDataClass();
1141  $localEntity = $dataClass::getEntity();
1142  }
1143 
1144  // if there is a shell pattern in final segment, run recursively
1145  if ((strlen($localDefinition) > 1 && strpos($localDefinition, '*') !== false)
1146  || strpos($localDefinition, '?') !== false
1147  )
1148  {
1149  // get fields by pattern
1150  foreach ($localEntity->getFields() as $field)
1151  {
1152  if (
1153  ($field instanceof ScalarField || $field instanceof ExpressionField)
1154  && fnmatch($localDefinition, $field->getName())
1155  )
1156  {
1157  // skip uf utm single
1158  if (
1159  substr($field->getName(), 0, 3) == 'UF_' && substr($field->getName(), -7) == '_SINGLE'
1160  && $localEntity->hasField(substr($field->getName(), 0, -7))
1161  )
1162  {
1163  continue;
1164  }
1165 
1166 
1167  // build alias
1168  $customAlias = null;
1169 
1170  if ($alias !== null)
1171  {
1172  // put alias as a prefix
1173  $customAlias = $alias.$field->getName();
1174  }
1175 
1176  // build definition
1177  $fieldDefinition = $field->getName();
1178 
1179  if (!empty($localEntityDef))
1180  {
1181  $fieldDefinition = $localEntityDef.'.'.$fieldDefinition;
1182  }
1183 
1184  $this->addToSelectChain($fieldDefinition, $customAlias);
1185  }
1186  }
1187 
1188  return $this;
1189  }
1190 
1191  // there is normal scalar field, or Reference, or Entity (all fields of)
1192  $chain = $this->getRegisteredChain($definition, true);
1193 
1194  if ($alias !== null)
1195  {
1196  // custom alias
1197  $chain = clone $chain;
1198  $chain->setCustomAlias($alias);
1199  }
1200 
1201  $last_elem = $chain->getLastElement();
1202 
1203  // fill if element is not scalar
1204  /** @var null|Entity $expand_entity */
1205  $expand_entity = null;
1206 
1207  if ($last_elem->getValue() instanceof Reference)
1208  {
1209  $expand_entity = $last_elem->getValue()->getRefEntity();
1210  }
1211  elseif (is_array($last_elem->getValue()))
1212  {
1213  list($expand_entity, ) = $last_elem->getValue();
1214  }
1215  elseif ($last_elem->getValue() instanceof Entity)
1216  {
1217  $expand_entity = $last_elem->getValue();
1218  }
1219  elseif ($last_elem->getValue() instanceof OneToMany)
1220  {
1221  $expand_entity = $last_elem->getValue()->getRefEntity();
1222  }
1223  elseif ($last_elem->getValue() instanceof ManyToMany)
1224  {
1225  $expand_entity = $last_elem->getValue()->getRefEntity();
1226  }
1227 
1228  if (!$expand_entity && $alias !== null)
1229  {
1230  // we have a single field, let's check its custom alias
1231  if (
1232  $this->entity->hasField($alias)
1233  && (
1234  // if it's not the same field
1235  $this->entity->getFullName() !== $last_elem->getValue()->getEntity()->getFullName()
1236  ||
1237  $last_elem->getValue()->getName() !== $alias
1238  )
1239  )
1240  {
1241  // deny aliases eq. existing fields
1242  throw new Main\ArgumentException(sprintf(
1243  'Alias "%s" matches already existing field "%s" of initial entity "%s". '.
1244  'Please choose another name for alias.',
1245  $alias, $alias, $this->entity->getFullName()
1246  ));
1247  }
1248  }
1249 
1250  if ($expand_entity)
1251  {
1252  // add all fields of entity
1253  foreach ($expand_entity->getFields() as $exp_field)
1254  {
1255  // except for references and expressions
1256  if ($exp_field instanceof ScalarField)
1257  {
1258  $exp_chain = clone $chain;
1259  $exp_chain->addElement(new ChainElement(
1260  $exp_field
1261  ));
1262 
1263  // custom alias
1264  if ($alias !== null)
1265  {
1266  $fieldAlias = $alias . $exp_field->getName();
1267 
1268  // deny aliases eq. existing fields
1269  if ($this->entity->hasField($fieldAlias))
1270  {
1271  throw new Main\ArgumentException(sprintf(
1272  'Alias "%s" + field "%s" match already existing field "%s" of initial entity "%s". '.
1273  'Please choose another name for alias.',
1274  $alias, $exp_field->getName(), $fieldAlias, $this->entity->getFullName()
1275  ));
1276  }
1277 
1278  $exp_chain->setCustomAlias($fieldAlias);
1279  }
1280 
1281  // add
1282  $this->registerChain('select', $exp_chain);
1283  }
1284  }
1285  }
1286  else
1287  {
1288  // scalar field that defined in entity
1289  $this->registerChain('select', $chain);
1290 
1291  // it would be nice here to register field as a runtime when it has custom alias
1292  // it will make possible to use aliased fields as a native init entity fields
1293  // e.g. in expressions or in data_doubling=off filter
1294 
1295  // collect buildFrom fields (recursively)
1296  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
1297  {
1298  $this->collectExprChains($chain, array('hidden', 'select_expr'));
1299  }
1300  }
1301  }
1302 
1303  return $this;
1304  }
static getChainByDefinition(Entity $init_entity, $definition)
addToSelectChain($definition, $alias=null)
registerRuntimeField($name, $fieldInfo=null)
Adds a runtime field (being created dynamically, opposite to being described statically in the entity...

◆ addUnionOrder()

addUnionOrder (   $definition,
  $order = 'ASC' 
)

General order for all the union queries.

Has the same format as Query::addOrder().

См. также
Query::addOrder()
Аргументы
string$definition
string$order
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 652

653  {
654  $this->getUnionHandler()->addOrder($definition, $order);
655  return $this;
656  }

◆ booleanStrongEqualityCallback()

booleanStrongEqualityCallback (   $field,
  $operation,
  $value 
)

См. определение в файле main/lib/orm/query/query.php строка 3460

3461  {
3462  $value = ($operation == 'SE') ? $value : !$value;
3463  return ($value ? '' : 'NOT ') . $field;
3464  }

◆ buildFilterSql()

static buildFilterSql ( Entity  $entity,
  $filter 
)
static

Builds SQL filter conditions for WHERE.

Useful for external calls: building SQL for mass UPDATEs or DELETEs

Аргументы
Entity$entity
array | Filter$filterthe same format as for setFilter/where
Возвращает
string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3849

3850  {
3851  $query = new static($entity);
3852 
3853  if ($filter instanceof Filter)
3854  {
3855  // new object filter
3856  $query->where($filter);
3857  }
3858  else
3859  {
3860  // old array filter
3861  $query->setFilter($filter);
3862  }
3863 
3864  $query->setCustomBaseTableAlias($entity->getDBTableName())->buildQuery();
3865 
3866  return $query->query_build_parts['WHERE'];
3867  }
buildQuery($forceObjectPrimary=true)

◆ buildGroup()

buildGroup ( )
protected
Возвращает
string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 2234

2235  {
2236  $sql = array();
2237 
2238  if ($this->hasAggregation())
2239  {
2240  // add non-aggr fields to group
2241  foreach ($this->global_chains as $chain)
2242  {
2243  $alias = $chain->getAlias();
2244 
2245  // skip constants
2246  if ($chain->isConstant())
2247  {
2248  continue;
2249  }
2250 
2251  if (isset($this->select_chains[$alias]) || isset($this->order_chains[$alias]) || isset($this->having_chains[$alias]))
2252  {
2253  if (isset($this->group_chains[$alias]))
2254  {
2255  // skip already grouped
2256  continue;
2257  }
2258  elseif (!$chain->hasAggregation() && !$chain->hasSubquery())
2259  {
2260  // skip subqueries and already aggregated
2261  $this->registerChain('group', $chain);
2262  }
2263  elseif (!$chain->hasAggregation() && $chain->hasSubquery() && $chain->getLastElement()->getValue() instanceof ExpressionField)
2264  {
2265  // but include build_from of subqueries
2266  $sub_chains = $chain->getLastElement()->getValue()->getBuildFromChains();
2267 
2268  foreach ($sub_chains as $sub_chain)
2269  {
2270  // build real subchain starting from init entity
2271  $real_sub_chain = clone $chain;
2272 
2273  foreach (array_slice($sub_chain->getAllElements(), 1) as $sub_chain_elem)
2274  {
2275  $real_sub_chain->addElement($sub_chain_elem);
2276  }
2277 
2278  // add to query
2279  $this->registerChain('group', $this->global_chains[$real_sub_chain->getAlias()]);
2280  }
2281  }
2282  }
2283  elseif (isset($this->having_expr_chains[$alias]))
2284  {
2285  if (!$chain->hasAggregation() && $chain->hasSubquery())
2286  {
2287  $this->registerChain('group', $chain);
2288  }
2289  }
2290  }
2291  }
2292 
2293  foreach ($this->group_chains as $chain)
2294  {
2295  $connection = $this->entity->getConnection();
2296  $sqlDefinition = $chain->getSqlDefinition();
2297  $valueField = $chain->getLastElement()->getValue();
2298 
2299  if ($valueField instanceof ExpressionField)
2300  {
2301  $valueField = $valueField->getValueField();
2302  }
2303 
2304  if (($connection instanceof Main\DB\OracleConnection || $connection instanceof Main\DB\MssqlConnection)
2305  && $valueField instanceof TextField)
2306  {
2307  // softTextCast
2308  $sqlDefinition = $connection->getSqlHelper()->softCastTextToChar($sqlDefinition);
2309  }
2310 
2311  $sql[] = $sqlDefinition;
2312  }
2313 
2314  return join(', ', $sql);
2315  }

◆ buildHaving()

buildHaving ( )
protected
Возвращает
string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 2322

2323  {
2324  $sql = array();
2325 
2326  // old array filter
2327  if (!empty($this->having))
2328  {
2329  $csw = new \CSQLWhere;
2330 
2331  $csw_fields = $this->getFilterCswFields($this->having);
2332  $csw->setFields($csw_fields);
2333 
2334  $sql[] = trim($csw->getQuery($this->having));
2335  }
2336 
2337  // new QueryFilter
2338  if ($this->havingHandler && $this->havingHandler->hasConditions())
2339  {
2340  // rewrite data doubling
2341  $this->rewriteDataDoubling($this->havingHandler, 'having');
2342 
2343  $sql[] = $this->havingHandler->getSql($this->having_chains);
2344  }
2345 
2346  return join(' AND ', array_filter($sql));
2347  }
rewriteDataDoubling(Filter $filter, $section)

◆ buildJoin()

buildJoin ( )
protected
Возвращает
string
Исключения
Main

Переопределяется в Query.

См. определение в файле main/lib/orm/query/query.php строка 2163

2164  {
2165  $sql = array();
2166  $csw = new \CSQLWhere;
2167 
2168  $connection = $this->entity->getConnection();
2169  $helper = $connection->getSqlHelper();
2170 
2171  foreach ($this->join_map as $join)
2172  {
2173  // prepare csw fields
2174  $csw_fields = $this->getJoinCswFields($join['reference']);
2175  $csw->setFields($csw_fields);
2176 
2177  if ($join['reference'] instanceof Filter)
2178  {
2179  $joinConditionSql = $join['reference']->getSql($this->global_chains);
2180  }
2181  else
2182  {
2183  $joinConditionSql = trim($csw->getQuery($join['reference']));
2184  }
2185 
2186  // final sql
2187  $sql[] = sprintf('%s JOIN %s %s ON %s',
2188  $join['type'],
2189  $this->quoteTableSource($join['table']),
2190  $helper->quote($join['alias']),
2191  $joinConditionSql
2192  );
2193  }
2194 
2195  return "\n".join("\n", $sql);
2196  }

◆ buildJoinMap()

buildJoinMap (   $chains = null)
protected
Аргументы
null$chains
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1884

1885  {
1886  $connection = $this->entity->getConnection();
1887  $helper = $connection->getSqlHelper();
1888 
1889  $aliasLength = $helper->getAliasLength();
1890 
1891  if (empty($chains))
1892  {
1893  $chains = $this->global_chains;
1894  }
1895 
1896  foreach ($chains as $chain)
1897  {
1898  if ($chain->getLastElement()->getParameter('talias'))
1899  {
1900  // already been here
1901  continue;
1902  }
1903 
1904  // in NO_DOUBLING mode skip 1:N relations that presented in filter only
1905  if ($chain->forcesDataDoublingOff() || ($this->data_doubling_off && $chain->hasBackReference()))
1906  {
1907  $alias = $chain->getAlias();
1908 
1909  if (isset($this->filter_chains[$alias])
1910  && !isset($this->select_chains[$alias]) && !isset($this->select_expr_chains[$alias])
1911  && !isset($this->group_chains[$alias]) && !isset($this->order_chains[$alias])
1912  )
1913  {
1914  continue;
1915  }
1916  }
1917 
1918  $prev_alias = $this->getInitAlias(false);
1919 
1920  $map_key = '';
1921 
1922  /**
1923  * elements after init entity
1924  * @var $elements ChainElement[]
1925  * */
1926  $elements = array_slice($chain->getAllElements(), 1);
1927 
1928  $currentDefinition = array();
1929 
1930  foreach ($elements as $element)
1931  {
1932  $table_alias = null;
1933 
1934  /**
1935  * define main objects
1936  * @var $ref_field Reference
1937  * @var $dst_entity Entity
1938  */
1939  if ($element->getValue() instanceof Reference)
1940  {
1941  // ref to another entity
1942  $ref_field = $element->getValue();
1943  $dst_entity = $ref_field->getRefEntity();
1944  $joinType = $ref_field->getJoinType();
1945  }
1946  elseif (is_array($element->getValue()))
1947  {
1948  // link from another entity to this
1949  list($dst_entity, $ref_field) = $element->getValue();
1950  $joinType = $ref_field->getJoinType();
1951  }
1952  elseif ($element->getValue() instanceof OneToMany)
1953  {
1954  // the same as back reference
1955  $dst_entity = $element->getValue()->getRefEntity();
1956  $ref_field = $element->getValue()->getRefField();
1957  $joinType = $element->getValue()->getJoinType() ?: $ref_field->getJoinType();
1958  }
1959  elseif ($element->getValue() instanceof ManyToMany)
1960  {
1961  $mtm = $element->getValue();
1962 
1963  // join mediator and remote entities in hidden mode
1964  // first, make new chain, remove everything after this mtm and remove mtm itself
1965  $tmpChain = clone $chain;
1966  $mtmDefinition = join('.', $currentDefinition);
1967 
1968  while ($tmpChain->getDefinition() != $mtmDefinition)
1969  {
1970  $tmpChain->removeLastElement();
1971  }
1972 
1973  // then add backReference to mediator - mediator entity and local reference
1974  $tmpChain->addElement(new ChainElement([
1975  $mtm->getMediatorEntity(), $mtm->getLocalReference()
1976  ]));
1977 
1978  // then add reference from mediator to remote entity
1979  $tmpChain->addElement(new ChainElement($mtm->getRemoteReference()));
1980 
1981  // now join this chain
1982  $this->registerChain('global', $tmpChain);
1983  $this->buildJoinMap([$tmpChain]);
1984 
1985  // and finally remember table alias for mtm element
1986  $prev_alias = $tmpChain->getLastElement()->getParameter('talias');
1987  $element->setParameter('talias', $prev_alias);
1988 
1989  // skip any standard actions, continue with next element
1990  continue;
1991  }
1992  else
1993  {
1994  // scalar field
1995  // if it's a field of the init entity, use getInitAlias to use 'base' alias
1996  if ($prev_alias === $this->getInitAlias(false))
1997  {
1998  $element->setParameter('talias', $this->getInitAlias());
1999  }
2000  else
2001  {
2002  $element->setParameter('talias', $prev_alias.$this->table_alias_postfix);
2003  }
2004 
2005  continue;
2006  }
2007 
2008  // mapping
2009  if (empty($map_key))
2010  {
2011  $map_key = join('.', $currentDefinition);
2012  }
2013 
2014  $map_key .= '/' . $ref_field->getName() . '/' . $dst_entity->getName();
2015 
2016  $currentDefinition[] = $element->getDefinitionFragment();
2017 
2018  if (isset($this->join_registry[$map_key]))
2019  {
2020  // already connected
2021  $table_alias = $this->join_registry[$map_key];
2022  }
2023  else
2024  {
2025  // prepare reference
2026  $reference = $ref_field->getReference();
2027 
2028  if ($element->getValue() instanceof Reference)
2029  {
2030  // ref to another entity
2031  if (is_null($table_alias))
2032  {
2033  $table_alias = $prev_alias.'_'.strtolower($ref_field->getName());
2034 
2035  if (strlen($table_alias.$this->table_alias_postfix) > $aliasLength)
2036  {
2037  $old_table_alias = $table_alias;
2038  $table_alias = 'TALIAS_' . (count($this->replaced_taliases) + 1);
2039  $this->replaced_taliases[$table_alias] = $old_table_alias;
2040  }
2041  }
2042 
2043  $alias_this = $prev_alias;
2044  $alias_ref = $table_alias;
2045 
2046  $isBackReference = false;
2047 
2048  $definition_this = join('.', array_slice($currentDefinition, 0, -1));
2049  $definition_ref = join('.', $currentDefinition);
2050  $definition_join = $definition_ref;
2051  }
2052  elseif (is_array($element->getValue()) || $element->getValue() instanceof OneToMany)
2053  {
2054  if (is_null($table_alias))
2055  {
2056  $table_alias = StringHelper::camel2snake($dst_entity->getName()).'_'.strtolower($ref_field->getName());
2057  $table_alias = $prev_alias.'_'.$table_alias;
2058 
2059  if (strlen($table_alias.$this->table_alias_postfix) > $aliasLength)
2060  {
2061  $old_table_alias = $table_alias;
2062  $table_alias = 'TALIAS_' . (count($this->replaced_taliases) + 1);
2063  $this->replaced_taliases[$table_alias] = $old_table_alias;
2064  }
2065  }
2066 
2067  $alias_this = $table_alias;
2068  $alias_ref = $prev_alias;
2069 
2070  $isBackReference = true;
2071 
2072  $definition_this = join('.', $currentDefinition);
2073  $definition_ref = join('.', array_slice($currentDefinition, 0, -1));
2074  $definition_join = $definition_this;
2075  }
2076  else
2077  {
2078  throw new Main\SystemException(sprintf('Unknown reference element `%s`', $element->getValue()));
2079  }
2080 
2081  // replace this. and ref. to real definition
2082  if ($reference instanceof Filter)
2083  {
2084  $csw_reference = $this->prepareJoinFilterReference(
2085  $reference,
2086  $alias_this.$this->table_alias_postfix,
2087  $alias_ref.$this->table_alias_postfix,
2088  $definition_this,
2089  $definition_ref,
2090  $isBackReference
2091  );
2092  }
2093  else
2094  {
2095  $csw_reference = $this->prepareJoinReference(
2096  $reference,
2097  $alias_this.$this->table_alias_postfix,
2098  $alias_ref.$this->table_alias_postfix,
2099  $definition_this,
2100  $definition_ref,
2101  $isBackReference
2102  );
2103  }
2104 
2105  // double check after recursive call in prepareJoinReference
2106  if (!isset($this->join_registry[$map_key]))
2107  {
2108  $join = array(
2109  'type' => $joinType,
2110  'entity' => $dst_entity,
2111  'definition' => $definition_join,
2112  'table' => $dst_entity->getDBTableName(),
2113  'alias' => $table_alias.$this->table_alias_postfix,
2114  'reference' => $csw_reference,
2115  'map_key' => $map_key
2116  );
2117 
2118  $this->join_map[] = $join;
2119  $this->join_registry[$map_key] = $table_alias;
2120  }
2121  }
2122 
2123  // set alias for each element
2124  $element->setParameter('talias', $table_alias.$this->table_alias_postfix);
2125 
2126  $prev_alias = $table_alias;
2127  }
2128  }
2129  }
prepareJoinFilterReference(Filter $reference, $alias_this, $alias_ref, $baseDefinition, $refDefinition, $isBackReference, $firstCall=true)
prepareJoinReference($reference, $alias_this, $alias_ref, $baseDefinition, $refDefinition, $isBackReference)
static camel2snake($str)
Changes registry from CamelCase to snake_case.

◆ buildOrder()

buildOrder ( )
protected
Возвращает
string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 2353

2354  {
2355  $sql = array();
2356 
2357  foreach ($this->order_chains as $chain)
2358  {
2359  $sort = isset($this->order[$chain->getDefinition()])
2360  ? $this->order[$chain->getDefinition()]
2361  : $this->order[$chain->getAlias()];
2362 
2363  $connection = $this->entity->getConnection();
2364 
2365  // define value field
2366  $valueField = $chain->getLastElement()->getValue();
2367  if ($valueField instanceof ExpressionField)
2368  {
2369  $valueField = $valueField->getValueField();
2370  }
2371 
2372  // get final sql definition
2373  if (isset($this->select_chains[$chain->getAlias()]))
2374  {
2375  // optimization for fields that are in select already
2376  $sqlDefinition = $connection->getSqlHelper()->quote($chain->getAlias());
2377  }
2378  else
2379  {
2380  $sqlDefinition = $chain->getSqlDefinition();
2381  }
2382 
2383  if (($connection instanceof Main\DB\OracleConnection || $connection instanceof Main\DB\MssqlConnection)
2384  && $valueField instanceof TextField)
2385  {
2386  // softTextCast
2387  $sqlDefinition = $connection->getSqlHelper()->softCastTextToChar($sqlDefinition);
2388  }
2389 
2390  $sql[] = $sqlDefinition. ' ' . $sort;
2391  }
2392 
2393  return join(', ', $sql);
2394  }

◆ buildQuery()

buildQuery (   $forceObjectPrimary = true)
protected
Аргументы
bool$forceObjectPrimaryAdd missing primaries to select
Возвращает
mixed|string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 2403

2404  {
2405  $connection = $this->entity->getConnection();
2406  $helper = $connection->getSqlHelper();
2407 
2408  if ($this->query_build_parts === null)
2409  {
2410 
2411  foreach ($this->select as $key => $value)
2412  {
2413  $this->addToSelectChain($value, is_numeric($key) ? null : $key);
2414  }
2415 
2416  $this->setFilterChains($this->filter);
2417  $this->divideFilter();
2418 
2419  // unconditional entity scope
2420  $this->entity->setDefaultScope($this);
2421 
2422  $this->setFilterHandlerChains($this->filterHandler);
2423  $this->divideFilterHandler();
2424 
2425  foreach ($this->group as $value)
2426  {
2427  $this->addToGroupChain($value);
2428  }
2429 
2430  foreach ($this->order as $key => $value)
2431  {
2432  $this->addToOrderChain($key);
2433  }
2434 
2435  $this->buildJoinMap();
2436 
2437  if ($forceObjectPrimary && empty($this->unionHandler))
2438  {
2439  $this->ensurePrimarySelect();
2440  }
2441 
2442  $sqlJoin = $this->buildJoin();
2443 
2444  $sqlSelect = $this->buildSelect();
2445  $sqlWhere = $this->buildWhere();
2446  $sqlGroup = $this->buildGroup();
2447  $sqlHaving = $this->buildHaving();
2448  $sqlOrder = $this->buildOrder();
2449 
2450  $sqlFrom = $this->quoteTableSource($this->entity->getDBTableName());
2451 
2452  $sqlFrom .= ' '.$helper->quote($this->getInitAlias());
2453  $sqlFrom .= ' '.$sqlJoin;
2454 
2455  $this->query_build_parts = array_filter(array(
2456  'SELECT' => $sqlSelect,
2457  'FROM' => $sqlFrom,
2458  'WHERE' => $sqlWhere,
2459  'GROUP BY' => $sqlGroup,
2460  'HAVING' => $sqlHaving,
2461  'ORDER BY' => $sqlOrder
2462  ));
2463 
2464  // ensure there are no private fields in query
2465  $this->checkForPrivateFields();
2466  }
2467 
2468  $build_parts = $this->query_build_parts;
2469 
2470  foreach ($build_parts as $k => &$v)
2471  {
2472  $v = $k . ' ' . $v;
2473  }
2474 
2475  $query = join("\n", $build_parts);
2476 
2477  list($query, $replaced) = $this->replaceSelectAliases($query);
2478  $this->replaced_aliases = $replaced;
2479 
2480  if ($this->limit > 0)
2481  {
2482  $query = $helper->getTopSql($query, $this->limit, $this->offset);
2483  }
2484 
2485  // union
2486  if (!empty($this->unionHandler))
2487  {
2488  $query = "({$query})";
2489 
2490  foreach ($this->unionHandler->getQueries() as $union)
2491  {
2492  $query .= " ".$union->getSql();
2493  }
2494 
2495  // union sort
2496  if ($this->unionHandler->getOrder())
2497  {
2498  $sqlUnionOrder = array();
2499  foreach ($this->unionHandler->getOrder() as $definition => $sort)
2500  {
2501  $sqlDefinition = $connection->getSqlHelper()->quote(
2502  $this->global_chains[$definition]->getAlias()
2503  );
2504 
2505  $sqlUnionOrder[] = $sqlDefinition . ' ' . $sort;
2506  }
2507 
2508  $query .= ' ORDER BY ' . join(', ', $sqlUnionOrder);
2509  }
2510 
2511  // union limit
2512  if ($this->unionHandler->getLimit())
2513  {
2514  $query = $helper->getTopSql($query, $this->unionHandler->getLimit(), $this->unionHandler->getOffset());
2515  }
2516  }
2517 
2518  return $query;
2519  }
setFilterHandlerChains(Filter $where, $section='filter')
setFilterChains(&$filter, $section='filter')

◆ buildSelect()

buildSelect ( )
protected

См. определение в файле main/lib/orm/query/query.php строка 2131

2132  {
2133  $sql = [];
2134 
2135  foreach ($this->select_chains as $chain)
2136  {
2137  $sql[] = $chain->getSqlDefinition(true);
2138  }
2139 
2140  // empty select (or select forced primary only)
2141  if (empty($sql) ||
2142  (!empty($this->forcedObjectPrimaryFields) && count($sql) == count($this->forcedObjectPrimaryFields))
2143  )
2144  {
2145  $sql[] = 1;
2146  }
2147 
2148  $strSql = join(",\n\t", $sql);
2149 
2150  if ($this->hasDistinct() && $this->is_distinct)
2151  {
2152  // distinct by query settings, not by field
2153  $strSql = 'DISTINCT '.$strSql;
2154  }
2155 
2156  return "\n\t".$strSql;
2157  }

◆ buildWhere()

buildWhere ( )
protected
Возвращает
string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 2203

2204  {
2205  $sql = array();
2206 
2207  // old array filter
2208  if (!empty($this->where))
2209  {
2210  $csw = new \CSQLWhere;
2211 
2212  $csw_fields = $this->getFilterCswFields($this->where);
2213  $csw->setFields($csw_fields);
2214 
2215  $sql[] = trim($csw->getQuery($this->where));
2216  }
2217 
2218  // new QueryFilter
2219  if ($this->whereHandler && $this->whereHandler->hasConditions())
2220  {
2221  // rewrite data doubling
2222  $this->rewriteDataDoubling($this->whereHandler, 'where');
2223 
2224  $sql[] = $this->whereHandler->getSql($this->where_chains);
2225  }
2226 
2227  return join(' AND ', array_filter($sql));
2228  }

◆ cacheJoins()

cacheJoins (   $mode)

Enables or disables caching of queries with joins.

Аргументы
bool$mode
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 3929

3930  {
3931  $this->cacheJoins = (bool)$mode;
3932  return $this;
3933  }
cacheJoins($mode)
Enables or disables caching of queries with joins.

◆ checkChainsAggregation()

checkChainsAggregation (   $chain)
protected
Аргументы
$chain
Возвращает
bool
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3218

3219  {
3220  /** @var Chain[] $chains */
3221  $chains = is_array($chain) ? $chain : array($chain);
3222 
3223  foreach ($chains as $chain)
3224  {
3225  $last = $chain->getLastElement();
3226  $is_aggr = $last->getValue() instanceof ExpressionField && $last->getValue()->isAggregated();
3227 
3228  if ($is_aggr)
3229  {
3230  return true;
3231  }
3232  }
3233 
3234  return false;
3235  }

◆ checkChainsDistinct()

checkChainsDistinct (   $chain)
protected

См. определение в файле main/lib/orm/query/query.php строка 3237

3238  {
3239  /** @var Chain[] $chains */
3240  $chains = is_array($chain) ? $chain : array($chain);
3241 
3242  foreach ($chains as $chain)
3243  {
3244  $field = $chain->getLastElement()->getValue();
3245 
3246  if ($field instanceof ExpressionField)
3247  {
3248  $expression = $field->getFullExpression();
3249  $expression = ExpressionField::removeSubqueries($expression);
3250 
3251  preg_match_all('/(?:^|[^a-z0-9_])(DISTINCT)[\s\‍(]+/i', $expression, $matches);
3252 
3253  if (!empty($matches[1]))
3254  {
3255  return true;
3256  }
3257  }
3258  }
3259 
3260  return false;
3261  }

◆ checkFilterAggregation()

checkFilterAggregation (   $filter)
protected
Аргументы
$filter
Возвращает
bool
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1714

1715  {
1716  foreach ($filter as $filter_def => $filter_match)
1717  {
1718  if ($filter_def === 'LOGIC')
1719  {
1720  continue;
1721  }
1722 
1723  $is_having = false;
1724  if (!is_numeric($filter_def))
1725  {
1726  $sqlWhere = new \CSQLWhere();
1727  $csw_result = $sqlWhere->makeOperation($filter_def);
1728  list($definition, ) = array_values($csw_result);
1729 
1730  $chain = $this->filter_chains[$definition];
1731  $last = $chain->getLastElement();
1732 
1733  $is_having = $last->getValue() instanceof ExpressionField && $last->getValue()->isAggregated();
1734  }
1735  elseif (is_array($filter_match))
1736  {
1737  $is_having = $this->checkFilterAggregation($filter_match);
1738  }
1739 
1740  if ($is_having)
1741  {
1742  return true;
1743  }
1744  }
1745 
1746  return false;
1747  }

◆ checkFilterHandlerAggregation()

checkFilterHandlerAggregation ( Filter  $filter)
protected
Аргументы
Filter$filter
Возвращает
bool
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1755

1756  {
1757  foreach ($filter->getConditions() as $condition)
1758  {
1759  $is_having = false;
1760 
1761  if ($condition instanceof Filter)
1762  {
1763  // subfilter
1764  $is_having = $this->checkFilterHandlerAggregation($condition);
1765  }
1766  else
1767  {
1768  // check if it is not a boolean/exists condition
1769  if ($condition->getDefinition() !== null)
1770  {
1771  // regular condition
1772  $chain = $this->filter_chains[$condition->getDefinition()];
1773  $last = $chain->getLastElement();
1774 
1775  $is_having = $last->getValue() instanceof ExpressionField && $last->getValue()->isAggregated();
1776 
1777  // check if value is a field and has aggregation
1778  if (!$is_having && $condition->getValue() instanceof ColumnExpression)
1779  {
1780  $chain = $this->filter_chains[$condition->getValue()->getDefinition()];
1781  $last = $chain->getLastElement();
1782 
1783  $is_having = $last->getValue() instanceof ExpressionField && $last->getValue()->isAggregated();
1784 
1785  // actually if it has happened, we need to add group by the first column
1786  }
1787  }
1788  }
1789 
1790  if ($is_having)
1791  {
1792  return true;
1793  }
1794  }
1795 
1796  return false;
1797  }

◆ checkForPrivateFields()

checkForPrivateFields ( )
protected

См. определение в файле main/lib/orm/query/query.php строка 755

756  {
757  // check in filter
758  foreach ($this->filter_chains as $chain)
759  {
760  if (static::isFieldPrivate($chain->getLastElement()->getValue()))
761  {
762  $columnField = $chain->getLastElement()->getValue();
763 
764  throw new SystemException(sprintf(
765  'Private field %s.%s is restricted in filter',
766  $columnField->getEntity()->getDataClass(),
767  $columnField->getName()
768  ));
769  }
770  }
771 
772  // check in general
773  if ($this->private_fields_on !== true)
774  {
775  foreach ($this->global_chains as $chain)
776  {
777  if (static::isFieldPrivate($chain->getLastElement()->getValue()))
778  {
779  $columnField = $chain->getLastElement()->getValue();
780 
781  trigger_error(sprintf(
782  'Private field %s.%s is restricted in query, use Query::enablePrivateFields() to allow it',
783  $columnField->getEntity()->getDataClass(),
784  $columnField->getName()
785  ), E_USER_WARNING);
786  }
787  }
788  }
789  }

◆ collectExprChains()

collectExprChains ( Chain  $chain,
  $storages = array('hidden') 
)
protected

The most magic method.

Do not edit without strong need, and for sure run tests after.

Аргументы
Chain$chain
array$storages
Возвращает
Chain[]
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3299

3300  {
3301  $last_elem = $chain->getLastElement();
3302  $bf_chains = $last_elem->getValue()->getBuildFromChains();
3303 
3304  $pre_chain = clone $chain;
3305  //$pre_chain->removeLastElement();
3306  $scopedBuildFrom = [];
3307 
3308  foreach ($bf_chains as $bf_chain)
3309  {
3310  // collect hidden chain
3311  $tmp_chain = clone $pre_chain;
3312 
3313  // exclude init entity
3314  /** @var ChainElement[] $bf_elements */
3315  $bf_elements = array_slice($bf_chain->getAllElements(), 1);
3316 
3317  // add elements
3318  foreach ($bf_elements as $bf_element)
3319  {
3320  $tmp_chain->addElement($bf_element);
3321  }
3322 
3323  //if (!($bf_chain->getLastElement()->getValue() instanceof ExpressionField))
3324  {
3325  foreach ($storages as $storage)
3326  {
3327  $reg_chain = $this->registerChain($storage, $tmp_chain);
3328  }
3329 
3330  // replace "build_from" chain end by registered chain end
3331  // actually it's better and more correctly to replace the whole chain
3332  $bf_chain->removeLastElement();
3333  /** @var Chain $reg_chain */
3334  $bf_chain->addElement($reg_chain->getLastElement());
3335 
3336  // return buildFrom elements with original start of chain for this query
3337  $scoped_bf_chain = clone $pre_chain;
3338  $scoped_bf_chain->removeLastElement();
3339 
3340  // copy tail from registered chain
3341  $tail = array_slice($reg_chain->getAllElements(), $pre_chain->getSize());
3342 
3343  foreach ($tail as $tailElement)
3344  {
3345  $scoped_bf_chain->addElement($tailElement);
3346  }
3347 
3348  $scopedBuildFrom[] = $scoped_bf_chain;
3349  }
3350 
3351  // check elements to recursive collect hidden chains
3352  foreach ($bf_elements as $bf_element)
3353  {
3354  if ($bf_element->getValue() instanceof ExpressionField)
3355  {
3356  $this->collectExprChains($tmp_chain);
3357  }
3358  }
3359  }
3360 
3361  return $scopedBuildFrom;
3362  }

◆ countTotal()

countTotal (   $count = null)

См. определение в файле main/lib/orm/query/query.php строка 575

576  {
577  if ($count === null)
578  {
579  return $this->countTotal;
580  }
581  else
582  {
583  $this->countTotal = (bool) $count;
584  return $this;
585  }
586  }

◆ dataDoublingCallback()

dataDoublingCallback (   $field,
  $operation,
  $value 
)
Аргументы
$operation@noinspection PhpUnusedParameterInspection

См. определение в файле main/lib/orm/query/query.php строка 3471

3472  {
3473  return $field.' IN ('.$value.')';
3474  }

◆ disableDataDoubling()

disableDataDoubling ( )

Replaces all 1:N relations in filter to ID IN (subquery SELECT ID FROM <1:N relation>) Available for Entities with 1 primary field only.

Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 704

705  {
706  if (count($this->entity->getPrimaryArray()) !== 1)
707  {
708  // mssql doesn't support constructions WHERE (col1, col2) IN (SELECT col1, col2 FROM SomeOtherTable)
709  /* @see http://connect.microsoft.com/SQLServer/feedback/details/299231/add-support-for-ansi-standard-row-value-constructors */
710  trigger_error(sprintf(
711  'Disabling data doubling available for Entities with 1 primary field only. Number of primaries of your entity `%s` is %d.',
712  $this->entity->getFullName(), count($this->entity->getPrimaryArray())
713  ), E_USER_WARNING);
714  }
715  else
716  {
717  $this->data_doubling_off = true;
718  }
719 
720  return $this;
721  }

◆ disablePrivateFields()

disablePrivateFields ( )

Restricts private fields in query.

Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 740

741  {
742  $this->private_fields_on = false;
743 
744  return $this;
745  }

◆ divideFilter()

divideFilter ( )
protected
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1592

1593  {
1594  // divide filter to where and having
1595 
1596  $logic = isset($this->filter['LOGIC']) ? $this->filter['LOGIC'] : 'AND';
1597 
1598  if ($logic == 'OR')
1599  {
1600  // if has aggr then move all to having
1601  if ($this->checkFilterAggregation($this->filter))
1602  {
1603  $this->where = array();
1604  $this->where_chains = array();
1605 
1606  $this->having = $this->filter;
1607  $this->having_chains = $this->filter_chains;
1608  }
1609  else
1610  {
1611  $this->where = $this->filter;
1612  $this->where_chains = $this->filter_chains;
1613 
1614  $this->having = array();
1615  $this->having_chains = array();
1616  }
1617  }
1618  elseif ($logic == 'AND')
1619  {
1620  // we can separate root filters
1621  foreach ($this->filter as $k => $sub_filter)
1622  {
1623  if ($k === 'LOGIC')
1624  {
1625  $this->where[$k] = $sub_filter;
1626  $this->having[$k] = $sub_filter;
1627 
1628  continue;
1629  }
1630 
1631  $tmp_filter = array($k => $sub_filter);
1632 
1633  if ($this->checkFilterAggregation($tmp_filter))
1634  {
1635  $this->having[$k] = $sub_filter;
1636  $this->setFilterChains($tmp_filter, 'having');
1637  }
1638  else
1639  {
1640  $this->where[$k] = $sub_filter;
1641  $this->setFilterChains($tmp_filter, 'where');
1642  }
1643  }
1644  }
1645 
1646  // collect "build_from" fields from having
1647  foreach ($this->having_chains as $chain)
1648  {
1649  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
1650  {
1651  $this->collectExprChains($chain, array('hidden', 'having_expr'));
1652  }
1653  }
1654  }

◆ divideFilterHandler()

divideFilterHandler ( )
protected
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1660

1661  {
1662  $logic = $this->filterHandler->logic();
1663 
1664  if ($logic == 'or')
1665  {
1666  // if has aggr then move all to having
1667  if ($this->checkFilterHandlerAggregation($this->filterHandler))
1668  {
1669  $this->havingHandler = $this->filterHandler;
1670  $this->having_chains = $this->filter_chains;
1671  }
1672  else
1673  {
1674  $this->whereHandler = $this->filterHandler;
1675  $this->where_chains = $this->filter_chains;
1676  }
1677  }
1678  elseif ($logic == 'and')
1679  {
1680  // we can separate root filters
1681  foreach ($this->filterHandler->getConditions() as $condition)
1682  {
1683  $tmpFilter = static::filter()->addCondition($condition);
1684 
1685  if ($this->checkFilterHandlerAggregation($tmpFilter))
1686  {
1687  $this->havingHandler->addCondition($tmpFilter);
1688  $this->setFilterHandlerChains($tmpFilter, 'having');
1689  }
1690  else
1691  {
1692  $this->whereHandler->addCondition($condition);
1693  $this->setFilterHandlerChains($tmpFilter, 'where');
1694  }
1695  }
1696  }
1697 
1698  // collect "build_from" fields from having
1699  foreach ($this->having_chains as $chain)
1700  {
1701  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
1702  {
1703  $this->collectExprChains($chain, array('hidden', 'having_expr'));
1704  }
1705  }
1706  }

◆ dump()

dump ( )

См. определение в файле main/lib/orm/query/query.php строка 3935

3936  {
3937  echo '<pre>';
3938 
3939  echo 'last query: ';
3940  var_dump(static::$last_query);
3941  echo PHP_EOL;
3942 
3943  echo 'size of select_chains: '.count($this->select_chains);
3944  echo PHP_EOL;
3945  foreach ($this->select_chains as $num => $chain)
3946  {
3947  echo ' chain ['.$num.'] has '.$chain->getSize().' elements: '.PHP_EOL;
3948  $chain->dump();
3949  echo PHP_EOL;
3950  }
3951 
3952  echo PHP_EOL.PHP_EOL;
3953 
3954  echo 'size of where_chains: '.count($this->where_chains);
3955  echo PHP_EOL;
3956  foreach ($this->where_chains as $num => $chain)
3957  {
3958  echo ' chain ['.$num.'] has '.$chain->getSize().' elements: '.PHP_EOL;
3959  $chain->dump();
3960  echo PHP_EOL;
3961  }
3962 
3963  echo PHP_EOL.PHP_EOL;
3964 
3965  echo 'size of group_chains: '.count($this->group_chains);
3966  echo PHP_EOL;
3967  foreach ($this->group_chains as $num => $chain)
3968  {
3969  echo ' chain ['.$num.'] has '.$chain->getSize().' elements: '.PHP_EOL;
3970  $chain->dump();
3971  echo PHP_EOL;
3972  }
3973 
3974  echo PHP_EOL.PHP_EOL;
3975 
3976  echo 'size of having_chains: '.count($this->having_chains);
3977  echo PHP_EOL;
3978  foreach ($this->having_chains as $num => $chain)
3979  {
3980  echo ' chain ['.$num.'] has '.$chain->getSize().' elements: '.PHP_EOL;
3981  $chain->dump();
3982  echo PHP_EOL;
3983  }
3984 
3985  echo PHP_EOL.PHP_EOL;
3986 
3987  echo 'size of filter_chains: '.count($this->filter_chains);
3988  echo PHP_EOL;
3989  foreach ($this->filter_chains as $num => $chain)
3990  {
3991  echo ' chain ['.$num.'] has '.$chain->getSize().' elements: '.PHP_EOL;
3992  $chain->dump();
3993  echo PHP_EOL;
3994  }
3995 
3996  echo PHP_EOL.PHP_EOL;
3997 
3998  echo 'size of select_expr_chains: '.count($this->select_expr_chains);
3999  echo PHP_EOL;
4000  foreach ($this->select_expr_chains as $num => $chain)
4001  {
4002  echo ' chain ['.$num.'] has '.$chain->getSize().' elements: '.PHP_EOL;
4003  $chain->dump();
4004  echo PHP_EOL;
4005  }
4006 
4007  echo PHP_EOL.PHP_EOL;
4008 
4009  echo 'size of hidden_chains: '.count($this->hidden_chains);
4010  echo PHP_EOL;
4011  foreach ($this->hidden_chains as $num => $chain)
4012  {
4013  echo ' chain ['.$num.'] has '.$chain->getSize().' elements: '.PHP_EOL;
4014  $chain->dump();
4015  echo PHP_EOL;
4016  }
4017 
4018  echo PHP_EOL.PHP_EOL;
4019 
4020  echo 'size of global_chains: '.count($this->global_chains);
4021  echo PHP_EOL;
4022  foreach ($this->global_chains as $num => $chain)
4023  {
4024  echo ' chain ['.$num.'] has '.$chain->getSize().' elements: '.PHP_EOL;
4025  $chain->dump();
4026  echo PHP_EOL;
4027  }
4028 
4029  echo PHP_EOL.PHP_EOL;
4030 
4031  var_dump($this->join_map);
4032 
4033  echo '</pre>';
4034  }

◆ enableDataDoubling()

enableDataDoubling ( )
См. также
disableDataDoubling
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 691

692  {
693  $this->data_doubling_off = false;
694 
695  return $this;
696  }

◆ enablePrivateFields()

enablePrivateFields ( )

Allows private fields in query.

Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 728

729  {
730  $this->private_fields_on = true;
731 
732  return $this;
733  }

◆ ensurePrimarySelect()

ensurePrimarySelect ( )
protected

См. определение в файле main/lib/orm/query/query.php строка 1022

1023  {
1024  // no auto primary for queries with group
1025  // it may change the result
1026  if ($this->hasAggregation() || $this->hasDistinct())
1027  {
1028  return;
1029  }
1030 
1031  $entities = [[$this->entity, '']];
1032 
1033  foreach ($this->join_map as $join)
1034  {
1035  $entities[] = [$join['entity'], $join];
1036  }
1037 
1038  // check for primaries in select
1039  foreach ($entities as list($entity, $join))
1040  {
1041  /** @var Entity $entity */
1042  foreach ($entity->getPrimaryArray() as $primary)
1043  {
1044  if (!empty($entity->getField($primary)->hasParameter('auto_generated')))
1045  {
1046  continue;
1047  }
1048 
1049  $needDefinition = !empty($join['definition']) ? $join['definition'].'.'.$primary : $primary;
1050 
1051  $chain = $this->getRegisteredChain($needDefinition, true);
1052 
1053  if (empty($this->select_chains[$chain->getAlias()]))
1054  {
1055  // set uniq alias
1056  $alias = $this->getUniqueAlias();
1057  $chain->setCustomAlias($alias);
1058 
1059  $this->registerChain('select', $chain);
1060 
1061  // remember to delete alias from array result
1062  $this->forcedObjectPrimaryFields[] = $alias;
1063 
1064  // set join alias
1065  !empty($join)
1066  ? $chain->getLastElement()->setParameter('talias', $join['alias'])
1067  : $chain->getLastElement()->setParameter('talias', $this->getInitAlias());
1068  }
1069  }
1070  }
1071  }

◆ exec()

exec ( )

Builds and executes the query and returns the result.

Возвращает
Result
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 926

927  {
928  $this->is_executing = true;
929 
930  $query = $this->buildQuery();
931 
932  $cacheId = "";
933  $ttl = 0;
934  $result = null;
935 
936  if($this->cacheTtl > 0 && (empty($this->join_map) || $this->cacheJoins == true))
937  {
938  $ttl = $this->entity->getCacheTtl($this->cacheTtl);
939  }
940 
941  if($ttl > 0)
942  {
943  $cacheId = md5($query);
944  $result = $this->entity->readFromCache($ttl, $cacheId, $this->countTotal);
945  }
946 
947  if($result === null)
948  {
949  $result = $this->query($query);
950 
951  if($ttl > 0)
952  {
953  $result = $this->entity->writeToCache($result, $cacheId, $this->countTotal);
954  }
955  }
956 
957  $this->is_executing = false;
958 
959  $queryResult = new Result($this, $result);
960 
961  if (!empty($this->forcedObjectPrimaryFields))
962  {
963  $queryResult->setHiddenObjectFields($this->forcedObjectPrimaryFields);
964  }
965 
966  return $queryResult;
967  }

◆ expr()

static expr ( )
static

Used to create ExpressionField in a short way.

См. также
Filter::where()
Возвращает
Expression

См. определение в файле main/lib/orm/query/query.php строка 909

910  {
911  if (static::$expressionHelper === null)
912  {
913  static::$expressionHelper = new Expression;
914  }
915 
916  return static::$expressionHelper;
917  }

◆ fetch()

fetch ( \Bitrix\Main\Text\Converter  $converter = null)

Short alias for $result->fetch()

Аргументы
Main\Text\Converter | null$converter
Возвращает
array|false
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 978

979  {
980  return $this->exec()->fetch($converter);
981  }
exec()
Builds and executes the query and returns the result.

◆ fetchAll()

fetchAll ( \Bitrix\Main\Text\Converter  $converter = null)

Short alias for $result->fetchAll()

Аргументы
Main\Text\Converter | null$converter
Возвращает
array
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 992

993  {
994  return $this->exec()->fetchAll($converter);
995  }

◆ fetchCollection()

fetchCollection ( )

Short alias for $result->fetchCollection()

Возвращает
null Actual type should be annotated by orm:annotate
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1017

1018  {
1019  return $this->exec()->fetchCollection();
1020  }

◆ fetchDataModificationCallback()

fetchDataModificationCallback ( $data)

Being called in Db\Result as a data fetch modifier.

Аргументы
$data

См. определение в файле main/lib/orm/query/query.php строка 3604

3605  {
3606  // entity-defined callbacks
3607  foreach ($this->selectFetchModifiers as $alias => $modifiers)
3608  {
3609  foreach ($modifiers as $modifier)
3610  {
3611  $data[$alias] = call_user_func_array($modifier, array($data[$alias], $this, $data, $alias));
3612  }
3613  }
3614  }

◆ fetchObject()

fetchObject ( )

Short alias for $result->fetchObject()

Возвращает
null Actual type should be annotated by orm:annotate
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1005

1006  {
1007  return $this->exec()->fetchObject();
1008  }

◆ filter()

static filter ( )
static

Returns new instance of Filter.

Usage: Query::filter()->where(...)

Alternatively short calls Query::where* can be used.

См. также
Query::where()
Возвращает
Filter

См. определение в файле main/lib/orm/query/query.php строка 898

899  {
900  return new Filter;
901  }

◆ getChains()

getChains ( )
Возвращает
array|Chain[]

См. определение в файле main/lib/orm/query/query.php строка 3735

3736  {
3737  return $this->global_chains;
3738  }

◆ getEntity()

getEntity ( )

См. определение в файле main/lib/orm/query/query.php строка 3833

3834  {
3835  return $this->entity;
3836  }

◆ getFilter()

getFilter ( )

Returns an array of filters for WHERE clause.

Возвращает
array

См. определение в файле main/lib/orm/query/query.php строка 367

368  {
369  return $this->filter;
370  }

◆ getFilterChains()

getFilterChains ( )
Возвращает
array|Chain[]

См. определение в файле main/lib/orm/query/query.php строка 3767

3768  {
3769  return $this->filter_chains;
3770  }

◆ getFilterCswFields()

getFilterCswFields ( $filter)
protected
Аргументы
$filter
Возвращает
array
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 2528

2529  {
2530  $fields = array();
2531 
2532  foreach ($filter as $filter_def => &$filter_match)
2533  {
2534  if ($filter_def === 'LOGIC')
2535  {
2536  continue;
2537  }
2538 
2539  if (!is_numeric($filter_def))
2540  {
2541  $sqlWhere = new \CSQLWhere();
2542  $csw_result = $sqlWhere->makeOperation($filter_def);
2543  list($definition, $operation) = array_values($csw_result);
2544 
2545  $chain = $this->filter_chains[$definition];
2546  $last = $chain->getLastElement();
2547 
2548  // need to create an alternative of CSQLWhere in D7.Entity
2549  $field_type = $last->getValue()->getDataType();
2550  $callback = null;
2551 
2552  // rewrite type & value for CSQLWhere
2553  if (in_array($operation, array('SE', 'SN'), true)
2554  && in_array($filter_match, array(null, true, false), true)
2555  )
2556  {
2557  $field_type = 'callback';
2558 
2559  if ($filter_match === null)
2560  {
2561  $callback = array($this, 'nullEqualityCallback');
2562  }
2563  else
2564  {
2565  // just boolean expression, without operator
2566  // e.g. WHERE EXISTS(...)
2567  $callback = array($this, 'booleanStrongEqualityCallback');
2568  }
2569  }
2570  elseif ($field_type == 'integer')
2571  {
2572  $field_type = 'int';
2573  }
2574  elseif ($field_type == 'boolean')
2575  {
2576  $field_type = 'string';
2577 
2578  /** @var BooleanField $field */
2579  $field = $last->getValue();
2580  $values = $field->getValues();
2581 
2582  if (is_numeric($values[0]) && is_numeric($values[1]))
2583  {
2584  $field_type = 'int';
2585  }
2586 
2587  if (is_scalar($filter_match))
2588  {
2589  $filter_match = $field->normalizeValue($filter_match);
2590  }
2591  }
2592  elseif ($field_type == 'float')
2593  {
2594  $field_type = 'double';
2595  }
2596  elseif ($field_type == 'enum' || $field_type == 'text')
2597  {
2598  $field_type = 'string';
2599  }
2600 
2601  $sqlDefinition = $chain->getSqlDefinition();
2602 
2603  // data-doubling-off mode
2604  /** @see disableDataDoubling */
2605  if ($chain->forcesDataDoublingOff() || ($this->data_doubling_off && $chain->hasBackReference()))
2606  {
2607  $primaryName = $this->entity->getPrimary();
2608  $uniquePostfix = '_TMP'.rand();
2609 
2610  // build subquery
2611  $subQuery = new Query($this->entity);
2612  $subQuery->addSelect($primaryName);
2613  $subQuery->addFilter($filter_def, $filter_match);
2614  $subQuery->setTableAliasPostfix(strtolower($uniquePostfix));
2615  $subQuerySql = $subQuery->getQuery();
2616 
2617  // proxying subquery as value to callback
2618  $filter_match = $subQuerySql;
2619  $callback = array($this, 'dataDoublingCallback');
2620 
2621  $field_type = 'callback';
2622 
2623  // change sql definition
2624  $idChain = $this->getRegisteredChain($primaryName);
2625  $sqlDefinition = $idChain->getSqlDefinition();
2626  }
2627 
2628  // set entity connection to the sql expressions
2629  if ($filter_match instanceof Main\DB\SqlExpression)
2630  {
2631  $filter_match->setConnection($this->entity->getConnection());
2632  }
2633 
2634  //$is_having = $last->getValue() instanceof ExpressionField && $last->getValue()->isAggregated();
2635 
2636  // if back-reference found (Entity:REF)
2637  // if NO_DOUBLING mode enabled, then change getSQLDefinition to subquery exists(...)
2638  // and those chains should not be in joins if it is possible
2639 
2640  /*if (!$this->data_doubling && $chain->hasBackReference())
2641  {
2642  $field_type = 'callback';
2643  $init_query = $this;
2644 
2645  $callback = function ($field, $operation, $value) use ($init_query, $chain)
2646  {
2647  $init_entity = $init_query->getEntity();
2648  $init_table_alias = CBaseEntity::camel2snake($init_entity->getName()).$init_query->getTableAliasPostfix();
2649 
2650  $filter = array();
2651 
2652  // add primary linking with main query
2653  foreach ($init_entity->getPrimaryArray() as $primary)
2654  {
2655  $filter['='.$primary] = new CSQLWhereExpression('?#', $init_table_alias.'.'.$primary);
2656  }
2657 
2658  // add value filter
2659  $filter[CSQLWhere::getOperationByCode($operation).$chain->getDefinition()] = $value;
2660 
2661  // build subquery
2662  $query_class = __CLASS__;
2663  $sub_query = new $query_class($init_entity);
2664  $sub_query->setFilter($filter);
2665  $sub_query->setTableAliasPostfix('_sub');
2666 
2667  return 'EXISTS(' . $sub_query->getQuery() . ')';
2668  };
2669  }*/
2670 
2671  $fields[$definition] = array(
2672  'TABLE_ALIAS' => 'table',
2673  'FIELD_NAME' => $sqlDefinition,
2674  'FIELD_TYPE' => $field_type,
2675  'MULTIPLE' => '',
2676  'JOIN' => '',
2677  'CALLBACK' => $callback
2678  );
2679  }
2680  elseif (is_array($filter_match))
2681  {
2682  $fields = array_merge($fields, $this->getFilterCswFields($filter_match));
2683  }
2684  }
2685 
2686  return $fields;
2687  }

◆ getFilterHandler()

getFilterHandler ( )
Возвращает
Filter

См. определение в файле main/lib/orm/query/query.php строка 408

409  {
410  return $this->filterHandler;
411  }

◆ getGroup()

getGroup ( )

Returns an array of fields for GROUP BY clause.

Возвращает
array

См. определение в файле main/lib/orm/query/query.php строка 418

419  {
420  return $this->group;
421  }

◆ getGroupChains()

getGroupChains ( )
Возвращает
array|Chain[]

См. определение в файле main/lib/orm/query/query.php строка 3743

◆ getHavingChains()

getHavingChains ( )
Возвращает
array|Chain[]

См. определение в файле main/lib/orm/query/query.php строка 3759

◆ getHiddenChains()

getHiddenChains ( )
Возвращает
array

См. определение в файле main/lib/orm/query/query.php строка 3751

◆ getInitAlias()

getInitAlias (   $withPostfix = true)
Аргументы
bool$withPostfix
Возвращает
string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3875

3876  {
3877  if ($this->custom_base_table_alias !== null)
3878  {
3880  }
3881 
3882  $init_alias = strtolower($this->entity->getCode());
3883 
3884  // add postfix
3885  if ($withPostfix)
3886  {
3887  $init_alias .= $this->table_alias_postfix;
3888  }
3889 
3890  // check length
3891  $connection = $this->entity->getConnection();
3892  $aliasLength = $connection->getSqlHelper()->getAliasLength();
3893 
3894  if (strlen($init_alias) > $aliasLength)
3895  {
3896  $init_alias = 'base';
3897 
3898  // add postfix
3899  if ($withPostfix)
3900  {
3901  $init_alias .= $this->table_alias_postfix;
3902  }
3903  }
3904 
3905  return $init_alias;
3906  }

◆ getJoinCswFields()

getJoinCswFields (   $reference)
protected

См. определение в файле main/lib/orm/query/query.php строка 3175

3176  {
3177  $fields = array();
3178 
3179  foreach ($reference as $k => $v)
3180  {
3181  if ($k === 'LOGIC')
3182  {
3183  continue;
3184  }
3185 
3186  if (is_numeric($k))
3187  {
3188  $fields = array_merge($fields, $this->getJoinCswFields($v));
3189  }
3190  else
3191  {
3192  // key
3193  $sqlWhere = new \CSQLWhere();
3194  $csw_result = $sqlWhere->makeOperation($k);
3195  list($field, ) = array_values($csw_result);
3196 
3197  $fields[$field] = array(
3198  'TABLE_ALIAS' => 'alias',
3199  'FIELD_NAME' => $field,
3200  'FIELD_TYPE' => 'string',
3201  'MULTIPLE' => '',
3202  'JOIN' => ''
3203  );
3204 
3205  // no need to add values as csw fields
3206  }
3207  }
3208 
3209  return $fields;
3210  }

◆ getJoinMap()

getJoinMap ( )

См. определение в файле main/lib/orm/query/query.php строка 3804

3805  {
3806  return $this->join_map;
3807  }

◆ getLastQuery()

static getLastQuery ( )
static

Returns last executed query string.

Возвращает
string

См. определение в файле main/lib/orm/query/query.php строка 3828

3829  {
3830  return static::$last_query;
3831  }

◆ getLimit()

getLimit ( )

Returns a limit.

Возвращает
null|int

См. определение в файле main/lib/orm/query/query.php строка 536

◆ getOffset()

getOffset ( )

Returns an offset.

Возвращает
null|int

См. определение в файле main/lib/orm/query/query.php строка 558

◆ getOrder()

getOrder ( )

Returns an array of fields for ORDER BY clause.

Возвращает
array

См. определение в файле main/lib/orm/query/query.php строка 454

455  {
456  return $this->order;
457  }

◆ getOrderChains()

getOrderChains ( )
Возвращает
array|Chain[]

См. определение в файле main/lib/orm/query/query.php строка 3775

◆ getQuery()

getQuery (   $forceObjectPrimary = false)

Builds and returns SQL query string.

Аргументы
bool$forceObjectPrimary
Возвращает
string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3818

3819  {
3820  return $this->buildQuery($forceObjectPrimary);
3821  }

◆ getRegisteredChain()

getRegisteredChain (   $key,
  $force_create = false 
)
Аргументы
$key
bool$force_create
Возвращает
Chain|bool
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3437

3438  {
3439  if (isset($this->global_chains[$key]))
3440  {
3441  return $this->global_chains[$key];
3442  }
3443 
3444  if ($force_create)
3445  {
3446  $chain = Chain::getChainByDefinition($this->entity, $key);
3447  $this->registerChain('global', $chain);
3448 
3449  return $chain;
3450  }
3451 
3452  return false;
3453  }

◆ getReplacedAliases()

getReplacedAliases ( )

См. определение в файле main/lib/orm/query/query.php строка 3908

◆ getRuntimeChains()

getRuntimeChains ( )
Возвращает
Chain[]

См. определение в файле main/lib/orm/query/query.php строка 3799

◆ getSelect()

getSelect ( )

Returns an array of fields for SELECT clause.

Возвращает
array

См. определение в файле main/lib/orm/query/query.php строка 324

◆ getSelectChains()

getSelectChains ( )
Возвращает
array|Chain[]

См. определение в файле main/lib/orm/query/query.php строка 3783

◆ getTableAliasPostfix()

getTableAliasPostfix ( )

См. определение в файле main/lib/orm/query/query.php строка 869

870  {
872  }

◆ getUnionHandler()

getUnionHandler ( )
protected
Возвращает
Union
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3368

3369  {
3370  if ($this->unionHandler === null)
3371  {
3372  $this->unionHandler = new Union($this->entity->getConnection());
3373  }
3374 
3375  return $this->unionHandler;
3376  }

◆ getUniqueAlias()

getUniqueAlias ( )
protected

См. определение в файле main/lib/orm/query/query.php строка 3455

3456  {
3457  return 'UALIAS_'.($this->uniqueAliasCounter++);
3458  }

◆ getWhereChains()

getWhereChains ( )
Возвращает
array|Chain[]

См. определение в файле main/lib/orm/query/query.php строка 3791

◆ hasAggregation()

hasAggregation ( )

См. определение в файле main/lib/orm/query/query.php строка 3263

3264  {
3265  return !empty($this->group_chains) || !empty($this->having_chains)
3266  || $this->checkChainsAggregation($this->select_chains)
3267  || $this->checkChainsAggregation($this->order_chains);
3268  }

◆ hasBackReference()

hasBackReference ( )
Возвращает
bool
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3714

3715  {
3716  if (empty($this->global_chains))
3717  {
3718  throw new Main\SystemException('Query has not been executed or built');
3719  }
3720 
3721  foreach ($this->global_chains as $chain)
3722  {
3723  if ($chain->hasBackReference())
3724  {
3725  return true;
3726  }
3727  }
3728 
3729  return false;
3730  }

◆ hasDistinct()

hasDistinct ( )

См. определение в файле main/lib/orm/query/query.php строка 3277

3278  {
3279  $distinctInSelect = $this->checkChainsDistinct($this->select_chains);
3280 
3281  if ($distinctInSelect && $this->is_distinct)
3282  {
3283  // to avoid double distinct
3284  $this->is_distinct = false;
3285  }
3286 
3287  return ($distinctInSelect || $this->is_distinct);
3288  }

◆ isFetchModificationRequired()

isFetchModificationRequired ( )

Check if fetch data modification required, also caches modifier-callbacks.

Возвращает
bool
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3621

3622  {
3623  $this->selectFetchModifiers = array();
3624 
3625  foreach ($this->select_chains as $chain)
3626  {
3627  if ($chain->getLastElement()->getValue()->getFetchDataModifiers())
3628  {
3629  $this->selectFetchModifiers[$chain->getAlias()] = $chain->getLastElement()->getValue()->getFetchDataModifiers();
3630  }
3631  }
3632 
3633  return !empty($this->selectFetchModifiers) || !empty($this->files);
3634  }

◆ isFieldPrivate()

static isFieldPrivate (   $field)
static
Аргументы
Field | Main\ORM\Fields\IReadable$field
Возвращает
bool
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 798

799  {
800  if ($field instanceof ScalarField)
801  {
802  return $field->isPrivate();
803  }
804  elseif ($field instanceof ExpressionField)
805  {
806  foreach ($field->getBuildFromChains() as $chain)
807  {
808  if (static::isFieldPrivate($chain->getLastElement()->getValue()))
809  {
810  return true;
811  }
812  }
813  }
814 
815  return false;
816  }

◆ isPrivateFieldsEnabled()

isPrivateFieldsEnabled ( )
Возвращает
bool

См. определение в файле main/lib/orm/query/query.php строка 750

◆ nullEqualityCallback()

nullEqualityCallback (   $field,
  $operation,
  $value 
)
Аргументы
$value@noinspection PhpUnusedParameterInspection

См. определение в файле main/lib/orm/query/query.php строка 3466

3467  {
3468  return $field.' IS '.($operation == 'SE' ? '' : 'NOT ') . 'NULL';
3469  }

◆ prepareJoinFilterReference()

prepareJoinFilterReference ( Filter  $reference,
  $alias_this,
  $alias_ref,
  $baseDefinition,
  $refDefinition,
  $isBackReference,
  $firstCall = true 
)
protected
Аргументы
Filter$reference
$alias_this
$alias_ref
$baseDefinition
$refDefinition
$isBackReference
$firstCall
Возвращает
Filter
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 2950

2951  {
2952  // do not make an impact on original reference object
2953  if ($firstCall)
2954  {
2955  $reference = clone $reference;
2956  }
2957 
2958  foreach ($reference->getConditions() as $condition)
2959  {
2960  if ($condition instanceof Filter)
2961  {
2962  // subfilter, recursive call
2964  $condition,
2965  $alias_this,
2966  $alias_ref,
2967  $baseDefinition,
2968  $refDefinition,
2969  $isBackReference,
2970  false
2971  );
2972  }
2973  else
2974  {
2975  // regular condition
2976  $field = $condition->getDefinition();
2977 
2978  if (strpos($field, 'this.') === 0)
2979  {
2980  // parse the chain
2981  $definition = str_replace('this.', '', $field);
2982  $absDefinition = $baseDefinition <> ''? $baseDefinition.'.'.$definition : $definition;
2983 
2984  $chain = $this->getRegisteredChain($absDefinition, true);
2985 
2986  if (!$isBackReference)
2987  {
2988  // make sure these fields will be joined before the main join
2989  $this->buildJoinMap(array($chain));
2990  }
2991  else
2992  {
2993  $chain->getLastElement()->setParameter('talias', $alias_this);
2994  }
2995 
2996  // recursively collect all "build_from" fields
2997  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
2998  {
2999  $this->collectExprChains($chain);
3000  $buildFrom = $chain->getLastElement()->getValue()->getBuildFromChains();
3001 
3002  foreach ($buildFrom as $bf)
3003  {
3004  // set base chain
3005  $baseChain = clone $chain;
3006 
3007  // remove the last one - expression itself
3008  $baseChain->removeLastElement();
3009 
3010  // remove parent entity for this child
3011  $bf->removeFirstElement();
3012 
3013  // set new parents
3014  $bf->prepend($baseChain);
3015  }
3016 
3017  $this->buildJoinMap($buildFrom);
3018  }
3019 
3020  $condition->setColumn($absDefinition);
3021  }
3022  elseif (strpos($field, 'ref.') === 0)
3023  {
3024  $definition = str_replace('ref.', '', $field);
3025 
3026  if (strpos($definition, '.') !== false)
3027  {
3028  throw new Main\ArgumentException(sprintf(
3029  'Reference chain `%s` is not allowed here. First-level definitions only.', $field
3030  ));
3031  }
3032 
3033  $absDefinition = $refDefinition <> ''? $refDefinition.'.'.$definition : $definition;
3034  $chain = $this->getRegisteredChain($absDefinition, true);
3035 
3036  if ($isBackReference)
3037  {
3038  // make sure these fields will be joined before the main join
3039  $this->buildJoinMap(array($chain));
3040  }
3041  else
3042  {
3043  $chain->getLastElement()->setParameter('talias', $alias_ref);
3044  }
3045 
3046  // recursively collect all "build_from" fields
3047  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
3048  {
3049  $this->collectExprChains($chain);
3050  $this->buildJoinMap($chain->getLastElement()->getValue()->getBuildFromChains());
3051  }
3052 
3053  $condition->setColumn($absDefinition);
3054  }
3055  else
3056  {
3057  throw new Main\SystemException(sprintf('Unknown reference key `%s`, it should start with "this." or "ref."', $field));
3058  }
3059 
3060  // value
3061  $v = $condition->getValue();
3062 
3063  if ($v instanceof Main\DB\SqlExpression)
3064  {
3065  // set entity connection
3066  $v->setConnection($this->entity->getConnection());
3067  }
3068  elseif ($v instanceof ColumnExpression)
3069  {
3070  if (strpos($v->getDefinition(), 'this.') === 0)
3071  {
3072  $definition = str_replace('this.', '', $v->getDefinition());
3073  $absDefinition = $baseDefinition <> ''? $baseDefinition.'.'.$definition : $definition;
3074 
3075  $chain = $this->getRegisteredChain($absDefinition, true);
3076 
3077  if (!$isBackReference)
3078  {
3079  // make sure these fields will be joined before the main join
3080  $this->buildJoinMap(array($chain));
3081  }
3082  else
3083  {
3084  $chain->getLastElement()->setParameter('talias', $alias_this);
3085  }
3086 
3087  // recursively collect all "build_from" fields
3088  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
3089  {
3090  $this->collectExprChains($chain);
3091  $buildFrom = $chain->getLastElement()->getValue()->getBuildFromChains();
3092 
3093  foreach ($buildFrom as $bf)
3094  {
3095  // set base chain
3096  $baseChain = clone $chain;
3097 
3098  // remove the last one - expression itself
3099  $baseChain->removeLastElement();
3100 
3101  // remove parent entity for this child
3102  $bf->removeFirstElement();
3103 
3104  // set new parents
3105  $bf->prepend($baseChain);
3106  }
3107 
3108  $this->buildJoinMap($buildFrom);
3109  }
3110 
3111  $v->setDefinition($absDefinition);
3112  }
3113  elseif (strpos($v->getDefinition(), 'ref.') === 0)
3114  {
3115  $definition = str_replace('ref.', '', $v->getDefinition());
3116 
3117  if (strpos($definition, '.') !== false)
3118  {
3119  throw new Main\ArgumentException(sprintf(
3120  'Reference chain `%s` is not allowed here. First-level definitions only.', $v->getDefinition()
3121  ));
3122  }
3123 
3124  $absDefinition = $refDefinition <> ''? $refDefinition.'.'.$definition : $definition;
3125  $chain = $this->getRegisteredChain($absDefinition, true);
3126 
3127  if ($isBackReference)
3128  {
3129  // make sure these fields will be joined before the main join
3130  $this->buildJoinMap(array($chain));
3131  }
3132  else
3133  {
3134  $chain->getLastElement()->setParameter('talias', $alias_ref);
3135  }
3136 
3137  $this->buildJoinMap(array($chain));
3138 
3139  // recursively collect all "build_from" fields
3140  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
3141  {
3142  // here could be one more check "First-level definitions only" for buildFrom elements
3143  $buildFromChains = $this->collectExprChains($chain);
3144 
3145  // set same talias to buildFrom elements
3146  foreach ($buildFromChains as $buildFromChain)
3147  {
3148  if (!$isBackReference && $buildFromChain->getSize() > $chain->getSize())
3149  {
3150  throw new Main\ArgumentException(sprintf(
3151  'Reference chain `%s` is not allowed here. First-level definitions only.',
3152  $buildFromChain->getDefinition()
3153  ));
3154  }
3155 
3156  if ($buildFromChain->getSize() === $chain->getSize())
3157  {
3158  // same entity, same table
3159  $buildFromChain->getLastElement()->setParameter('talias', $alias_ref);
3160  }
3161  }
3162 
3163  $this->buildJoinMap($buildFromChains);
3164  }
3165 
3166  $v->setDefinition($absDefinition);
3167  }
3168  }
3169  }
3170  }
3171 
3172  return $reference;
3173  }

◆ prepareJoinReference()

prepareJoinReference (   $reference,
  $alias_this,
  $alias_ref,
  $baseDefinition,
  $refDefinition,
  $isBackReference 
)
protected
Аргументы
$reference
$alias_this
$alias_ref
$baseDefinition
$refDefinition
$isBackReference
Возвращает
array
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 2701

2702  {
2703  $new = array();
2704 
2705  foreach ($reference as $k => $v)
2706  {
2707  if ($k === 'LOGIC')
2708  {
2709  $new[$k] = $v;
2710  continue;
2711  }
2712 
2713  if (is_numeric($k))
2714  {
2715  // subfilter, recursive call
2716  $new[$k] = $this->prepareJoinReference($v, $alias_this, $alias_ref, $baseDefinition, $refDefinition, $isBackReference);
2717  }
2718  else
2719  {
2720  // key
2721  $sqlWhere = new \CSQLWhere();
2722  $csw_result = $sqlWhere->makeOperation($k);
2723  list($field, $operation) = array_values($csw_result);
2724 
2725  if (strpos($field, 'this.') === 0)
2726  {
2727  // parse the chain
2728  $definition = str_replace(\CSQLWhere::getOperationByCode($operation).'this.', '', $k);
2729  $absDefinition = $baseDefinition <> ''? $baseDefinition.'.'.$definition : $definition;
2730 
2731  $chain = $this->getRegisteredChain($absDefinition, true);
2732 
2733  if (!$isBackReference)
2734  {
2735  // make sure these fields will be joined before the main join
2736  $this->buildJoinMap(array($chain));
2737  }
2738  else
2739  {
2740  $chain->getLastElement()->setParameter('talias', $alias_this);
2741  }
2742 
2743  // recursively collect all "build_from" fields
2744  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
2745  {
2746  $this->collectExprChains($chain);
2747  $buildFrom = $chain->getLastElement()->getValue()->getBuildFromChains();
2748 
2749  foreach ($buildFrom as $bf)
2750  {
2751  // set base chain
2752  $baseChain = clone $chain;
2753 
2754  // remove the last one - expression itself
2755  $baseChain->removeLastElement();
2756 
2757  // remove parent entity for this child
2758  $bf->removeFirstElement();
2759 
2760  // set new parents
2761  $bf->prepend($baseChain);
2762  }
2763 
2764  $this->buildJoinMap($buildFrom);
2765  }
2766 
2767  $k = \CSQLWhere::getOperationByCode($operation).$chain->getSqlDefinition();
2768  }
2769  elseif (strpos($field, 'ref.') === 0)
2770  {
2771  $definition = str_replace(\CSQLWhere::getOperationByCode($operation).'ref.', '', $k);
2772 
2773  if (strpos($definition, '.') !== false)
2774  {
2775  throw new Main\ArgumentException(sprintf(
2776  'Reference chain `%s` is not allowed here. First-level definitions only.', $field
2777  ));
2778  }
2779 
2780  $absDefinition = $refDefinition <> ''? $refDefinition.'.'.$definition : $definition;
2781  $chain = $this->getRegisteredChain($absDefinition, true);
2782 
2783  if ($isBackReference)
2784  {
2785  // make sure these fields will be joined before the main join
2786  $this->buildJoinMap(array($chain));
2787  }
2788  else
2789  {
2790  $chain->getLastElement()->setParameter('talias', $alias_ref);
2791  }
2792 
2793  // recursively collect all "build_from" fields
2794  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
2795  {
2796  $this->collectExprChains($chain);
2797  $this->buildJoinMap($chain->getLastElement()->getValue()->getBuildFromChains());
2798  }
2799 
2800  $k = \CSQLWhere::getOperationByCode($operation).$chain->getSqlDefinition();
2801  }
2802  else
2803  {
2804  throw new Main\SystemException(sprintf('Unknown reference key `%s`, it should start with "this." or "ref."', $k));
2805  }
2806 
2807  // value
2808  if (is_array($v))
2809  {
2810  // field = expression
2811  $v = new \CSQLWhereExpression($v[0], array_slice($v, 1));
2812  }
2813  elseif ($v instanceof Main\DB\SqlExpression)
2814  {
2815  // set entity connection
2816  $v->setConnection($this->entity->getConnection());
2817  }
2818  elseif (!is_object($v))
2819  {
2820  if (strpos($v, 'this.') === 0)
2821  {
2822  $definition = str_replace('this.', '', $v);
2823  $absDefinition = $baseDefinition <> ''? $baseDefinition.'.'.$definition : $definition;
2824 
2825  $chain = $this->getRegisteredChain($absDefinition, true);
2826 
2827  if (!$isBackReference)
2828  {
2829  // make sure these fields will be joined before the main join
2830  $this->buildJoinMap(array($chain));
2831  }
2832  else
2833  {
2834  $chain->getLastElement()->setParameter('talias', $alias_this);
2835  }
2836 
2837  // recursively collect all "build_from" fields
2838  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
2839  {
2840  $this->collectExprChains($chain);
2841  $buildFrom = $chain->getLastElement()->getValue()->getBuildFromChains();
2842 
2843  foreach ($buildFrom as $bf)
2844  {
2845  // set base chain
2846  $baseChain = clone $chain;
2847 
2848  // remove the last one - expression itself
2849  $baseChain->removeLastElement();
2850 
2851  // remove parent entity for this child
2852  $bf->removeFirstElement();
2853 
2854  // set new parents
2855  $bf->prepend($baseChain);
2856  }
2857 
2858  $this->buildJoinMap($buildFrom);
2859  }
2860 
2861  $field_def = $chain->getSqlDefinition();
2862  }
2863  elseif (strpos($v, 'ref.') === 0)
2864  {
2865  $definition = str_replace('ref.', '', $v);
2866 
2867  if (strpos($definition, '.') !== false)
2868  {
2869  throw new Main\ArgumentException(sprintf(
2870  'Reference chain `%s` is not allowed here. First-level definitions only.', $v
2871  ));
2872  }
2873 
2874  $absDefinition = $refDefinition <> ''? $refDefinition.'.'.$definition : $definition;
2875  $chain = $this->getRegisteredChain($absDefinition, true);
2876 
2877  if ($isBackReference)
2878  {
2879  // make sure these fields will be joined before the main join
2880  $this->buildJoinMap(array($chain));
2881  }
2882  else
2883  {
2884  $chain->getLastElement()->setParameter('talias', $alias_ref);
2885  }
2886 
2887  $this->buildJoinMap(array($chain));
2888 
2889  // recursively collect all "build_from" fields
2890  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
2891  {
2892  // here could be one more check "First-level definitions only" for buildFrom elements
2893  $buildFromChains = $this->collectExprChains($chain);
2894 
2895  // set same talias to buildFrom elements
2896  foreach ($buildFromChains as $buildFromChain)
2897  {
2898  if (!$isBackReference && $buildFromChain->getSize() > $chain->getSize())
2899  {
2900  throw new Main\ArgumentException(sprintf(
2901  'Reference chain `%s` is not allowed here. First-level definitions only.',
2902  $buildFromChain->getDefinition()
2903  ));
2904  }
2905 
2906  if ($buildFromChain->getSize() === $chain->getSize())
2907  {
2908  // same entity, same table
2909  $buildFromChain->getLastElement()->setParameter('talias', $alias_ref);
2910  }
2911  }
2912 
2913  $this->buildJoinMap($buildFromChains);
2914  }
2915 
2916  $field_def = $chain->getSqlDefinition();
2917  }
2918  else
2919  {
2920  throw new Main\SystemException(sprintf('Unknown reference value `%s`', $v));
2921  }
2922 
2923  $v = new \CSQLWhereExpression($field_def);
2924  }
2925  else
2926  {
2927  throw new Main\SystemException(sprintf('Unknown reference value `%s`, it should start with "this." or "ref."', $v));
2928  }
2929 
2930  $new[$k] = $v;
2931  }
2932  }
2933 
2934  return $new;
2935  }

◆ query()

string Last executed SQL query (   $query)
protected
Аргументы
$query
Возвращает
Main\DB\ArrayResult|Main\DB\Result
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3484

3485  {
3486  // check nosql configuration
3487  $connection = $this->entity->getConnection();
3488  $configuration = $connection->getConfiguration();
3489 
3490  /** @var Main\DB\Result $result */
3491  $result = null;
3492 
3493  if (isset($configuration['handlersocket']['read']))
3494  {
3495  // optimize through nosql
3496  $nosqlConnectionName = $configuration['handlersocket']['read'];
3497 
3498  $nosqlConnection = Main\Application::getInstance()->getConnectionPool()->getConnection($nosqlConnectionName);
3499  $isNosqlCapable = NosqlPrimarySelector::checkQuery($nosqlConnection, $this);
3500 
3501  if ($isNosqlCapable)
3502  {
3503  $nosqlResult = NosqlPrimarySelector::relayQuery($nosqlConnection, $this);
3504  $result = new Main\DB\ArrayResult($nosqlResult);
3505 
3506  // add data converters
3507  if (!empty($nosqlResult))
3508  {
3509  /** @var callable[] $converters */
3510  $converters = [];
3511 
3512  foreach ($this->getSelectChains() as $selectChain)
3513  {
3514  $field = $selectChain->getLastElement()->getValue();
3515 
3516  if ($field instanceof ScalarField)
3517  {
3518  $converter = $connection->getSqlHelper()->getConverter($field);
3519 
3520  if (is_callable($converter))
3521  {
3522  $converter[$selectChain->getAlias()] = $converter;
3523  }
3524  }
3525  }
3526 
3527  if (!empty($converters))
3528  {
3529  $result->setConverters($converters);
3530  }
3531  }
3532  }
3533  }
3534 
3535  if ($result === null)
3536  {
3537  // regular SQL query
3538  $result = $connection->query($query);
3539  $result->setReplacedAliases($this->replaced_aliases);
3540 
3541  if($this->countTotal)
3542  {
3543  if ($this->limit && ($result->getSelectedRowsCount() < $this->limit))
3544  {
3545  // optimization for first and last pages
3546  $result->setCount((int) $this->offset + $result->getSelectedRowsCount());
3547  }
3548  elseif (empty($this->limit))
3549  {
3550  // optimization for queries without limit
3551  $result->setCount($result->getSelectedRowsCount());
3552  }
3553  else
3554  {
3555  // dedicated query
3556  $result->setCount($this->queryCountTotal());
3557  }
3558  }
3559 
3560  static::$last_query = $query;
3561  }
3562 
3563  if ($this->isFetchModificationRequired())
3564  {
3565  $result->addFetchDataModifier(array($this, 'fetchDataModificationCallback'));
3566  }
3567 
3568  return $result;
3569  }
static getInstance()
Returns current instance of the Application.
static relayQuery(\Bitrix\Main\Data\Connection $connection, Query $query)
static checkQuery(\Bitrix\Main\Data\Connection $connection, Query $query)
isFetchModificationRequired()
Check if fetch data modification required, also caches modifier-callbacks.

◆ queryCountTotal()

queryCountTotal ( )

См. определение в файле main/lib/orm/query/query.php строка 3571

3572  {
3573  if ($this->query_build_parts === null)
3574  {
3575  $this->buildQuery();
3576  }
3577 
3578  $buildParts = $this->query_build_parts;
3579 
3580  //remove order
3581  unset($buildParts['ORDER BY']);
3582 
3583  //remove select
3584  $buildParts['SELECT'] = "1 cntholder";
3585 
3586  foreach ($buildParts as $k => &$v)
3587  {
3588  $v = $k . ' ' . $v;
3589  }
3590 
3591  $cntQuery = join("\n", $buildParts);
3592 
3593  // select count
3594  $cntQuery = /** @lang text */
3595  "SELECT COUNT(cntholder) AS TMP_ROWS_CNT FROM ({$cntQuery}) xxx";
3596 
3597  return $this->entity->getConnection()->queryScalar($cntQuery);
3598  }

◆ quoteTableSource()

quoteTableSource (   $source)
Аргументы
$source
Возвращает
string
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3682

3683  {
3684  // don't quote subqueries
3685  if (!preg_match('/\s*\‍(\s*SELECT.*\‍)\s*/is', $source))
3686  {
3687  $source = $this->entity->getConnection()->getSqlHelper()->quote($source);
3688  }
3689 
3690  return $source;
3691  }

◆ registerChain()

registerChain (   $section,
Chain  $chain,
  $opt_key = null 
)

См. определение в файле main/lib/orm/query/query.php строка 3378

3379  {
3380  $alias = $chain->getAlias();
3381 
3382  if (isset($this->global_chains[$alias]))
3383  {
3384  if ($this->global_chains[$alias]->getDefinition() == $chain->getDefinition())
3385  {
3386  $reg_chain = $this->global_chains[$alias];
3387  }
3388  else
3389  {
3390  // we have a collision
3391  // like book.author_id and book.author.id have the same aliases, but different definitions
3392  // in most of the cases it's not a problem, there would be the same expected data
3393  // but we need register this chain separately to be available for internal usage
3394  $reg_chain = $chain;
3395 
3396  $this->global_chains[$reg_chain->getDefinition()] = $chain;
3397 
3398  // or should we make unique alias and register with it?
3399  $alias = $this->getUniqueAlias();
3400  $chain->setCustomAlias($alias);
3401  $this->global_chains[$alias] = $chain;
3402  }
3403  }
3404  else
3405  {
3406  $reg_chain = $chain;
3407  $def = $reg_chain->getDefinition();
3408 
3409  $this->global_chains[$alias] = $chain;
3410  $this->global_chains[$def] = $chain;
3411  }
3412 
3413  $storage_name = $section . '_chains';
3414 
3415  // in case of collision do not rewrite by alias
3416  if (!isset($this->{$storage_name}[$alias]))
3417  {
3418  $this->{$storage_name}[$alias] = $reg_chain;
3419  }
3420 
3421  if (!is_null($opt_key))
3422  {
3423  $this->{$storage_name}[$opt_key] = $reg_chain;
3424  }
3425 
3426  return $reg_chain;
3427  }

◆ registerRuntimeField()

registerRuntimeField (   $name,
  $fieldInfo = null 
)

Adds a runtime field (being created dynamically, opposite to being described statically in the entity map)

Аргументы
string | null$name
array | Field$fieldInfo
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 828

829  {
830  if ($name instanceof Field && $fieldInfo === null)
831  {
832  // short call for Field objects
833  $fieldInfo = $name;
834  $name = $fieldInfo->getName();
835  }
836  elseif ((empty($name) || is_numeric($name)) && $fieldInfo instanceof Field)
837  {
838  $name = $fieldInfo->getName();
839  }
840 
841  // clone field as long as Field object could be initialized only once
842  // there is no need to initialize original object
843  if ($fieldInfo instanceof Field)
844  {
845  $fieldInfo = clone $fieldInfo;
846  }
847 
848  // attach field to the entity
849  $this->entity->addField($fieldInfo, $name);
850 
851  // force chain creation for further needs
852  $chain = $this->getRegisteredChain($name, true);
853  $this->registerChain('runtime', $chain);
854 
855  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
856  {
857  $this->collectExprChains($chain, array('hidden'));
858  }
859 
860  return $this;
861  }

◆ replaceSelectAliases()

replaceSelectAliases (   $query)
protected
Аргументы
$query
Возвращает
array
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 3642

3643  {
3644  $connection = $this->entity->getConnection();
3645  $helper = $connection->getSqlHelper();
3646 
3647  $length = (int) $helper->getAliasLength();
3648  $leftQuote = $helper->getLeftQuote();
3649  $rightQuote = $helper->getRightQuote();
3650 
3651  $replaced = array();
3652 
3653  preg_match_all(
3654  '/ AS '.preg_quote($leftQuote).'([a-z0-9_]{'.($length+1).',})'.preg_quote($rightQuote).'/i',
3655  $query, $matches
3656  );
3657 
3658  if (!empty($matches[1]))
3659  {
3660  foreach ($matches[1] as $alias)
3661  {
3662  $newAlias = 'FALIAS_'.count($replaced);
3663  $replaced[$newAlias] = $alias;
3664 
3665  $query = str_replace(
3666  ' AS ' . $helper->quote($alias),
3667  ' AS ' . $helper->quote($newAlias) . '/* '.$alias.' */',
3668  $query
3669  );
3670  }
3671  }
3672 
3673  return array($query, $replaced);
3674  }

◆ rewriteDataDoubling()

rewriteDataDoubling ( Filter  $filter,
  $section 
)
protected
Аргументы
Filter$filter
$section
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1806

1807  {
1808  foreach ($filter->getConditions() as $condition)
1809  {
1810  if ($condition instanceof Filter)
1811  {
1812  //subfilter
1813  $this->rewriteDataDoubling($condition, $section);
1814  }
1815  elseif ($condition->getDefinition() !== null)
1816  {
1817  // regular condition
1818  $chain = $this->filter_chains[$condition->getDefinition()];
1819 
1820  if ($chain->forcesDataDoublingOff() || ($this->data_doubling_off && $chain->hasBackReference()))
1821  {
1822  $primaryName = $this->entity->getPrimary();
1823  $uniquePostfix = '_TMP'.rand();
1824 
1825  // build subquery
1826  $dataClass = $this->entity->getDataClass();
1827 
1828  $subQuery = $dataClass::query()
1829  ->addSelect($primaryName)
1830  ->where(clone $condition)
1831  ->setTableAliasPostfix(strtolower($uniquePostfix));
1832 
1833  // change condition
1834  $condition->setColumn($primaryName);
1835  $condition->setOperator('in');
1836  $condition->setValue($subQuery);
1837 
1838  // register primary's chain
1839  $idChain = $this->getRegisteredChain($primaryName);
1840  $this->registerChain($section, $idChain);
1841  }
1842  }
1843  }
1844  }

◆ setCacheTtl()

setCacheTtl (   $ttl)

См. определение в файле main/lib/orm/query/query.php строка 3918

3919  {
3920  $this->cacheTtl = (int)$ttl;
3921  return $this;
3922  }

◆ setCustomBaseTableAlias()

setCustomBaseTableAlias (   $alias)

Sets a custom alias for the table of the init entity.

Аргументы
string$alias
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 881

882  {
883  $this->custom_base_table_alias = $alias;
884  return $this;
885  }

◆ setDistinct()

setDistinct (   $distinct = true)

См. определение в файле main/lib/orm/query/query.php строка 3270

3271  {
3272  $this->is_distinct = (bool) $distinct;
3273 
3274  return $this;
3275  }

◆ setFilter()

setFilter ( array  $filter)

Sets a list of filters for WHERE clause.

Аргументы
array$filter
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 378

379  {
380  $this->filter = $filter;
381  return $this;
382  }

◆ setFilterChains()

setFilterChains ( $filter,
  $section = 'filter' 
)
Аргументы
$filter
string$section
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1313

1314  {
1315  foreach ($filter as $filter_def => &$filter_match)
1316  {
1317  if ($filter_def === 'LOGIC')
1318  {
1319  continue;
1320  }
1321 
1322  if (!is_numeric($filter_def))
1323  {
1324  $sqlWhere = new \CSQLWhere();
1325  $csw_result = $sqlWhere->makeOperation($filter_def);
1326  list($definition, ) = array_values($csw_result);
1327 
1328  // do not register it in global chain registry - get it in a smuggled way
1329  // - we will do the registration later after UF rewriting and data doubling checking
1330  $chain = $this->getRegisteredChain($definition);
1331 
1332  if (!$chain)
1333  {
1334  // try to find it in filter chains if it is 2nd call of method (when dividing filter for where/having)
1335  // and chain is still not registered in global (e.g. when forcesDataDoublingOff)
1336  if (isset($this->filter_chains[$definition]))
1337  {
1338  $chain = $this->filter_chains[$definition];
1339  }
1340  else
1341  {
1342  $chain = Chain::getChainByDefinition($this->entity, $definition);
1343  }
1344  }
1345 
1346  // dirty hack for UF multiple fields: replace text UF_SMTH by UF_SMTH_SINGLE
1347  $dstField = $chain->getLastElement()->getValue();
1348  $dstEntity = $dstField->getEntity();
1349 
1350  if ($dstField instanceof ExpressionField && count($dstField->getBuildFromChains()) == 1)
1351  {
1352  // hold entity, but get real closing field
1353  $dstBuildFromChains = $dstField->getBuildFromChains();
1354 
1355  /** @var Chain $firstChain */
1356  $firstChain = $dstBuildFromChains[0];
1357  $dstField = $firstChain->getLastElement()->getValue();
1358  }
1359 
1360  // check for base linking
1361  if (($dstField instanceof TextField || $dstField instanceof ArrayField)
1362  && $dstEntity->hasField($dstField->getName().'_SINGLE'))
1363  {
1364  $utmLinkField = $dstEntity->getField($dstField->getName().'_SINGLE');
1365 
1366  if ($utmLinkField instanceof ExpressionField)
1367  {
1368  $buildFromChains = $utmLinkField->getBuildFromChains();
1369 
1370  // check for back-reference
1371  if (count($buildFromChains) == 1 && $buildFromChains[0]->hasBackReference())
1372  {
1373  $endField = $buildFromChains[0]->getLastElement()->getValue();
1374 
1375  // and final check for entity name
1376  if(strpos($endField->getEntity()->getName(), 'Utm'))
1377  {
1378  $expressionChain = clone $chain;
1379  $expressionChain->removeLastElement();
1380  $expressionChain->addElement(new ChainElement(clone $utmLinkField));
1381  $expressionChain->forceDataDoublingOff();
1382 
1383  $chain = $expressionChain;
1384 
1385  // rewrite filter definition
1386  unset($filter[$filter_def]);
1387  $filter[$filter_def.'_SINGLE'] = $filter_match;
1388  $definition .= '_SINGLE';
1389  }
1390  }
1391  }
1392  }
1393 
1394  // continue
1395  $registerChain = true;
1396 
1397  // if data doubling disabled and it is back-reference - do not register, it will be overwritten
1398  if ($chain->forcesDataDoublingOff() || ($this->data_doubling_off && $chain->hasBackReference()))
1399  {
1400  $registerChain = false;
1401  }
1402 
1403  if ($registerChain)
1404  {
1405  $this->registerChain($section, $chain, $definition);
1406 
1407  // fill hidden select
1408  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
1409  {
1410  $this->collectExprChains($chain);
1411  }
1412  }
1413  else
1414  {
1415  // hide from global registry to avoid "join table"
1416  // but we still need it in filter chains
1417  $this->filter_chains[$chain->getAlias()] = $chain;
1418  $this->filter_chains[$definition] = $chain;
1419 
1420  // and we will need primary chain in filter later when overwriting data-doubling
1421  $this->getRegisteredChain($this->entity->getPrimary(), true);
1422  }
1423  }
1424  elseif (is_array($filter_match))
1425  {
1426  $this->setFilterChains($filter_match, $section);
1427  }
1428  }
1429  }

◆ setFilterHandlerChains()

setFilterHandlerChains ( Filter  $where,
  $section = 'filter' 
)
Аргументы
Filter$where
string$section
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 1438

1439  {
1440  foreach ($where->getConditions() as $condition)
1441  {
1442  if ($condition instanceof Filter)
1443  {
1444  // subfilter
1445  $this->setFilterHandlerChains($condition, $section);
1446  }
1447  else
1448  {
1449  $definition = $condition->getDefinition();
1450 
1451  // check for runtime fields
1452  if ($definition instanceof Field)
1453  {
1454  // register runtime field
1455  $this->registerRuntimeField($definition);
1456 
1457  // rewrite definition in filter - replace field with its name
1458  $definition = $definition->getName();
1459  $condition->setDefinition($definition);
1460  }
1461 
1462  // check if it's a regular condition, not kind of boolean/exists expression
1463  if ($definition !== null)
1464  {
1465  // regular condition
1466  $chain = $this->getRegisteredChain($definition);
1467 
1468  if (!$chain)
1469  {
1470  // try to find it in filter chains if it is 2nd call of method (when dividing filter for where/having)
1471  // and chain is still not registered in global (e.g. when forcesDataDoublingOff)
1472  if (isset($this->filter_chains[$definition]))
1473  {
1474  $chain = $this->filter_chains[$definition];
1475  }
1476  else
1477  {
1478  $chain = Chain::getChainByDefinition($this->entity, $definition);
1479  }
1480  }
1481 
1482  // dirty hack for UF multiple fields: replace text UF_SMTH by UF_SMTH_SINGLE
1483  $dstField = $chain->getLastElement()->getValue();
1484  $dstEntity = $dstField->getEntity();
1485 
1486  if ($dstField instanceof ExpressionField && count($dstField->getBuildFromChains()) == 1)
1487  {
1488  // hold entity, but get real closing field
1489  $dstBuildFromChains = $dstField->getBuildFromChains();
1490 
1491  /** @var Chain $firstChain */
1492  $firstChain = $dstBuildFromChains[0];
1493  $dstField = $firstChain->getLastElement()->getValue();
1494  }
1495 
1496  // check for base linking
1497  if ($dstField instanceof TextField && $dstEntity->hasField($dstField->getName().'_SINGLE'))
1498  {
1499  $utmLinkField = $dstEntity->getField($dstField->getName().'_SINGLE');
1500 
1501  if ($utmLinkField instanceof ExpressionField)
1502  {
1503  $buildFromChains = $utmLinkField->getBuildFromChains();
1504 
1505  // check for back-reference
1506  if (count($buildFromChains) == 1 && $buildFromChains[0]->hasBackReference())
1507  {
1508  $endField = $buildFromChains[0]->getLastElement()->getValue();
1509 
1510  // and final check for entity name
1511  if(strpos($endField->getEntity()->getName(), 'Utm'))
1512  {
1513  $expressionChain = clone $chain;
1514  $expressionChain->removeLastElement();
1515  $expressionChain->addElement(new ChainElement(clone $utmLinkField));
1516  $expressionChain->forceDataDoublingOff();
1517 
1518  $chain = $expressionChain;
1519 
1520  // rewrite filter definition
1521  $definition .= '_SINGLE';
1522  $condition->setDefinition($definition);
1523  }
1524  }
1525  }
1526  }
1527 
1528  // continue
1529  $registerChain = true;
1530 
1531  // if data doubling disabled and it is back-reference - do not register, it will be overwritten
1532  if ($chain->forcesDataDoublingOff() || ($this->data_doubling_off && $chain->hasBackReference()))
1533  {
1534  $registerChain = false;
1535  }
1536 
1537  if ($registerChain)
1538  {
1539  $this->registerChain($section, $chain, $definition);
1540 
1541  // fill hidden select
1542  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
1543  {
1544  $this->collectExprChains($chain);
1545  }
1546  }
1547  else
1548  {
1549  // hide from global registry to avoid "join table"
1550  // but we still need it in filter chains
1551  $this->filter_chains[$chain->getAlias()] = $chain;
1552  $this->filter_chains[$definition] = $chain;
1553 
1554  // and we will need primary chain in filter later when overwriting data-doubling
1555  $this->getRegisteredChain($this->entity->getPrimary(), true);
1556  }
1557  }
1558 
1559  // when compare with column, put it in the chains too
1560  foreach ($condition->getAtomicValues() as $value)
1561  {
1562  if ($value instanceof ColumnExpression)
1563  {
1564  $valueDefinition = $value->getDefinition();
1565 
1566  if (isset($this->filter_chains[$valueDefinition]))
1567  {
1568  $chain = $this->filter_chains[$valueDefinition];
1569  }
1570  else
1571  {
1572  $chain = Chain::getChainByDefinition($this->entity, $valueDefinition);
1573  }
1574 
1575  $this->registerChain($section, $chain, $valueDefinition);
1576  }
1577 
1578  // set connection to correct escaping in expressions
1579  if ($value instanceof Main\DB\SqlExpression)
1580  {
1581  $value->setConnection($this->entity->getConnection());
1582  }
1583  }
1584  }
1585  }
1586  }

◆ setGroup()

setGroup (   $group)

Sets a list of fields in GROUP BY clause.

Аргументы
mixed$group
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 429

430  {
431  $group = !is_array($group) ? array($group) : $group;
432  $this->group = $group;
433 
434  return $this;
435  }

◆ setLimit()

setLimit (   $limit)

Sets a limit for LIMIT n clause.

Аргументы
int$limit
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 547

548  {
549  $this->limit = $limit;
550  return $this;
551  }

◆ setOffset()

setOffset (   $offset)

Sets an offset for LIMIT n, m clause.

Аргументы
int$offset
Возвращает
$this

См. определение в файле main/lib/orm/query/query.php строка 569

570  {
571  $this->offset = $offset;
572  return $this;
573  }

◆ setOrder()

setOrder (   $order)

Sets a list of fields for ORDER BY clause.

Format: setOrder('ID') – ORDER BY ID ASC setOrder(['ID' => 'DESC', 'NAME' => 'ASC]) – ORDER BY ID DESC, NAME ASC

Аргументы
mixed$order
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 471

472  {
473  $this->order = array();
474 
475  if (!is_array($order))
476  {
477  $order = array($order);
478  }
479 
480  foreach ($order as $k => $v)
481  {
482  if (is_numeric($k))
483  {
484  $this->addOrder($v);
485  }
486  else
487  {
488  $this->addOrder($k, $v);
489  }
490  }
491 
492  return $this;
493  }
addOrder($definition, $order='ASC')
Adds a filed to the list of fields for ORDER BY clause.

◆ setSelect()

setSelect ( array  $select)

Sets a list of fields for SELECT clause.

Аргументы
array$select
Возвращает
Query

См. определение в файле main/lib/orm/query/query.php строка 335

336  {
337  $this->select = $select;
338  return $this;
339  }

◆ setTableAliasPostfix()

setTableAliasPostfix (   $postfix)

См. определение в файле main/lib/orm/query/query.php строка 863

864  {
865  $this->table_alias_postfix = $postfix;
866  return $this;
867  }

◆ setUnionLimit()

setUnionLimit (   $limit)

General limit for all the union queries.

Аргументы
$limit
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 666

667  {
668  $this->getUnionHandler()->setLimit($limit);
669  return $this;
670  }

◆ setUnionOffset()

setUnionOffset (   $offset)

General offset for all the union queries.

Аргументы
$offset
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 680

681  {
682  $this->getUnionHandler()->setOffset($offset);
683  return $this;
684  }

◆ setUnionOrder()

setUnionOrder (   $order)

General order for all the union queries.

Has the same format as Query::setOrder().

См. также
Query::setOrder()
Аргументы
$order
Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 634

635  {
636  $this->getUnionHandler()->setOrder($order);
637  return $this;
638  }

◆ union()

union ( )

Puts additional query to union with current.

Accepts one ore more Query / SqlExpression.

Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 596

597  {
598  foreach (func_get_args() as $arg)
599  {
600  $this->getUnionHandler()->addQuery(new UnionCondition($arg, false));
601  }
602 
603  return $this;
604  }

◆ unionAll()

unionAll ( )

Puts additional query to union (all) with current.

Accepts one ore more Query / SqlExpression.

Возвращает
$this
Исключения
Main

См. определение в файле main/lib/orm/query/query.php строка 614

615  {
616  foreach (func_get_args() as $arg)
617  {
618  $this->getUnionHandler()->addQuery(new UnionCondition($arg, true));
619  }
620 
621  return $this;
622  }

Поля

◆ $cacheJoins

$cacheJoins = false

См. определение в файле main/lib/orm/query/query.php строка 236

◆ $cacheTtl

$cacheTtl = 0
protected

См. определение в файле main/lib/orm/query/query.php строка 235

◆ $countTotal

$countTotal = null

См. определение в файле main/lib/orm/query/query.php строка 125

◆ $custom_base_table_alias

$custom_base_table_alias = null
protected

См. определение в файле main/lib/orm/query/query.php строка 202

◆ $data_doubling_off

$data_doubling_off = false
protected

См. определение в файле main/lib/orm/query/query.php строка 189

◆ $entity

$entity
protected

См. определение в файле main/lib/orm/query/query.php строка 117

◆ $expressionHelper

$expressionHelper
staticprotected

См. определение в файле main/lib/orm/query/query.php строка 182

◆ $filter

$filter = array()
protected

См. определение в файле main/lib/orm/query/query.php строка 129

◆ $filter_chains

$filter_chains = array()
protected

См. определение в файле main/lib/orm/query/query.php строка 154

◆ $filterHandler

$filterHandler
protected

См. определение в файле main/lib/orm/query/query.php строка 134

◆ $forcedObjectPrimaryFields

$forcedObjectPrimaryFields
protected

См. определение в файле main/lib/orm/query/query.php строка 170

◆ $global_chains

$global_chains = array()
protected

См. определение в файле main/lib/orm/query/query.php строка 176

◆ $group

$group = array()

См. определение в файле main/lib/orm/query/query.php строка 121

◆ $group_chains

$group_chains = array()

См. определение в файле main/lib/orm/query/query.php строка 147

◆ $having

$having = array()

См. определение в файле main/lib/orm/query/query.php строка 131

◆ $having_chains

$having_chains = array()

См. определение в файле main/lib/orm/query/query.php строка 156

◆ $having_expr_chains

$having_expr_chains = array()

См. определение в файле main/lib/orm/query/query.php строка 163

◆ $havingHandler

$havingHandler
protected

См. определение в файле main/lib/orm/query/query.php строка 140

◆ $hidden_chains

$hidden_chains = array()

См. определение в файле main/lib/orm/query/query.php строка 164

◆ $is_distinct

$is_distinct = false
protected

См. определение в файле main/lib/orm/query/query.php строка 214

◆ $is_executing

$is_executing = false
protected

См. определение в файле main/lib/orm/query/query.php строка 217

◆ $join_map

$join_map = array()
protected

См. определение в файле main/lib/orm/query/query.php строка 205

◆ $join_registry

$join_registry
protected

См. определение в файле main/lib/orm/query/query.php строка 208

◆ $last_query

$last_query
staticprotected

См. определение в файле main/lib/orm/query/query.php строка 220

◆ $limit

$limit = null

См. определение в файле main/lib/orm/query/query.php строка 123

◆ $offset

$offset = null

См. определение в файле main/lib/orm/query/query.php строка 124

◆ $order

$order = array()

См. определение в файле main/lib/orm/query/query.php строка 122

◆ $order_chains

$order_chains = array()

См. определение в файле main/lib/orm/query/query.php строка 148

◆ $private_fields_on

$private_fields_on = false
protected

См. определение в файле main/lib/orm/query/query.php строка 196

◆ $query_build_parts

$query_build_parts
protected

См. определение в файле main/lib/orm/query/query.php строка 179

◆ $replaced_aliases

$replaced_aliases
protected

См. определение в файле main/lib/orm/query/query.php строка 223

◆ $replaced_taliases

$replaced_taliases
protected

См. определение в файле main/lib/orm/query/query.php строка 226

◆ $runtime_chains

$runtime_chains
protected

См. определение в файле main/lib/orm/query/query.php строка 173

◆ $select

$select = array()
protected

См. определение в файле main/lib/orm/query/query.php строка 120

◆ $select_chains

$select_chains = array()
protected

См. определение в файле main/lib/orm/query/query.php строка 146

◆ $select_expr_chains

$select_expr_chains = array()
protected

См. определение в файле main/lib/orm/query/query.php строка 162

◆ $selectFetchModifiers

$selectFetchModifiers = array()
protected

См. определение в файле main/lib/orm/query/query.php строка 232

◆ $table_alias_postfix

$table_alias_postfix = ''
protected

См. определение в файле main/lib/orm/query/query.php строка 199

◆ $unionHandler

$unionHandler
protected

См. определение в файле main/lib/orm/query/query.php строка 211

◆ $uniqueAliasCounter

$uniqueAliasCounter = 0
protected

См. определение в файле main/lib/orm/query/query.php строка 229

◆ $where

$where = array()

См. определение в файле main/lib/orm/query/query.php строка 130

◆ $where_chains

$where_chains = array()

См. определение в файле main/lib/orm/query/query.php строка 155

◆ $whereHandler

$whereHandler
protected

См. определение в файле main/lib/orm/query/query.php строка 137


Объявления и описания членов класса находятся в файле: