Страница 1 из 1

Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 10:12
new-developer-site
Здравствуйте! Подскажите пожалуйста как можно осуществить данный тип сортировки (натуральная или естественная)
мой код:

Код: Выделить всё

$this->data = Category::find()->indexBy('id')->orderBy('name')->asArray()->all();
данная сортировка сортирует вот так:

1
10
11
2
21
22
3

а нужно сортировать "естественно"

1
2
3
10
11
21
22

У кого есть какие идеи? Заранее спасибо за Ваше внимание.

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 14:18
someweb
Так сортирует СУБД, для строк "естественный" вариант первый.
Поменяйте тип поля на integer.

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 14:18
rak

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 15:37
new-developer-site
someweb писал(а): 2017.03.30, 14:18 Так сортирует СУБД, для строк "естественный" вариант первый.
Поменяйте тип поля на integer.
и даже не знал что СУБД здесь что-то может решать
в моем случая тип поля важен "VAR" так как в нем текст+цифры
вот такой список получаю
ДАВЛЕНИЕ 100КГ
ДАВЛЕНИЕ 10КГ
ДАВЛЕНИЕ 16КГ
ДАВЛЕНИЕ 250КГ
ДАВЛЕНИЕ 40КГ
ДАВЛЕНИЕ 600КГ
ДАВЛЕНИЕ 60КГ
ДАВЛЕНИЕ 6КГ

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 15:44
new-developer-site
rak писал(а): 2017.03.30, 14:18 http://stackoverflow.com/a/8557307
Вы имеете ввиду добавить вот так?

Код: Выделить всё

orderBy(['name' => 'ASC'])

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 15:53
rak
new-developer-site писал(а): 2017.03.30, 15:44
rak писал(а): 2017.03.30, 14:18 http://stackoverflow.com/a/8557307
Вы имеете ввиду добавить вот так?

Код: Выделить всё

orderBy(['name' => 'ASC'])
я имею в виду, что нужно почитать, что написано по ссылке

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 16:39
new-developer-site
что написано по ссылке
спасибо, я такое сам находил, до обращения на форум, но меня интересует вопрос как это внедрить в yii ...

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 16:52
rak
составьте sql запрос, который вам подходит, а мы поможем внедрить его в yii

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.30, 21:15
caHek2x
new-developer-site писал(а): 2017.03.30, 15:44
rak писал(а): 2017.03.30, 14:18 http://stackoverflow.com/a/8557307
Вы имеете ввиду добавить вот так?

Код: Выделить всё

orderBy(['name' => 'ASC'])
вы наверно не заметили по ссылке
ORDER BY LENGTH(alphanumeric), alphanumeric

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.31, 11:03
new-developer-site
rak писал(а): 2017.03.30, 16:52 составьте sql запрос, который вам подходит, а мы поможем внедрить его в yii

Код: Выделить всё

$sql = 'SELECT `name`,`id` FROM `cetegory` ORDER BY LENGTH (`name`),`name`';

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.31, 11:46
Krash
new-developer-site писал(а): 2017.03.31, 11:03
rak писал(а): 2017.03.30, 16:52 составьте sql запрос, который вам подходит, а мы поможем внедрить его в yii

Код: Выделить всё

$sql = 'SELECT `name`,`id` FROM `cetegory` ORDER BY LENGTH (`name`),`name`';
->orderBy(new \yii\db\Expression('LENGTH (name),name'))
Если сортировать только числа, то можно привидением типов сделать

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.31, 12:01
new-developer-site
->orderBy(new \yii\db\Expression('LENGTH (name),name'))
Если сортировать только числа, то можно привидением типов сделать
а если не только числа?

Re: Натуральная (естественная) сортировка

Добавлено: 2017.03.31, 12:40
caHek2x
new-developer-site писал(а): 2017.03.31, 12:01
->orderBy(new \yii\db\Expression('LENGTH (name),name'))
Если сортировать только числа, то можно привидением типов сделать
а если не только числа?
а если строки то то что выше и обсудили ...

Re: Натуральная (естественная) сортировка

Добавлено: 2017.04.04, 09:22
new-developer-site
спасибо товарищу -= caHek2x =- , он мне подсказал как решить данную проблему, уверен кому-то точно пригодится, выкладываю решение

Код: Выделить всё

$this->data = Category::find()->indexBy('id')->orderBy(new Expression('left(name, 2), LENGTH(name), name'))->asArray()->all();