Как отсортировать string с конвертацией в integer?

Чт, 10/08/2017 - 09:31

Есть такой запрос

$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 запроса?

0 Спасибо

Комментарии

Аватар пользователя tlito
1 неделя 4 дня назад tlito #

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-cast

учитывая код https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Database!Query!Select.php/class/Select/8.2.x

<?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 BY
    
if ($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'); ?>

но вероятно не пройдет, нужно писать запрос вручную.

0 Спасибо
Аватар пользователя Kanaris
1 неделя 4 дня назад Kanaris #

Место с сортировкой int ввиде string тоже нашёл. Решил пока просто удалить. "$this->connection->escapeField". Но хотелось бы иметь механизм нормальный, без редактирования основы CMS. Ощущение, что в этом месте специально сделали защиту от "программиста".
$fields[] = $this->connection->escapeField($field) . ' ' . $direction;

0 Спасибо
Аватар пользователя tlito
1 неделя 4 дня назад tlito #

укажите в issue на официальном сайте

0 Спасибо