Есть такой запрос
$query = \Drupal::database()->select('sets', 'sets');
$query->fields('sets', ['code', 'title', 'partCount', 'year', 'age']);
...
$query->join($subPricequery, 'shop_sets', 'sets.id = shop_sets.set_id');
$query->condition('sets.thema_id', $theme['id']);
$query->orderBy('year', 'ASC');
Где year - это string, мне нужен sorting natural. т.е. год должен быть упорядочен по возрастанию
Как это сделать не меняя API запроса?
Комментарии
https://stackoverflow.com/questions/12126991/cast-from-varchar-to-int-mysql - вам нужен запрос ORDER BY CAST(year AS UNSIGNED) ASC
https://drupal.stackexchange.com/questions/22163/drupal-7-db-query-using...
учитывая код https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Database!Query!Se...
<?php
658 public function orderBy($field, $direction = 'ASC') {
// Only allow ASC and DESC, default to ASC.
$direction = strtoupper($direction) == 'DESC' ? 'DESC' : 'ASC';
$this->order[$field] = $direction;
return $this;
}
...
856 // ORDER BYif ($this->order) {
$query .= "\nORDER BY ";
$fields = [];
foreach ($this->order as $field => $direction) {
$fields[] = $this->connection->escapeField($field) . ' ' . $direction;
}
$query .= implode(', ', $fields);
}?>
попробуйте, например:
<?php
$query->orderBy('CAST(year as UNSIGNED)', 'ASC'); ?>
но вероятно не пройдет, нужно писать запрос вручную.
Место с сортировкой int ввиде string тоже нашёл. Решил пока просто удалить. "$this->connection->escapeField". Но хотелось бы иметь механизм нормальный, без редактирования основы CMS. Ощущение, что в этом месте специально сделали защиту от "программиста".
$fields[] = $this->connection->escapeField($field) . ' ' . $direction;
укажите в issue на официальном сайте