[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сортировка. Интересно ваше мнение
Страницы: 1, 2
kaww
Допустим есть элементы какой-то группы, которые хранятся в БД. В таблице есть поле sort_index, по которому выполняется сортировка при выводе данных.
Собственно вопрос: Как лучше организовать механизм сортировки? Сейчас дляэтого используется метод sorting($index = 0), который в качестве параметра принимает желаемый индекс. Но для пользователя это кажется не совсем удобным т.к. приходится вычислять индекс желаемой позиции, (что не совсем логично и заставляет пользователя задумываться о реализации сортировки и понимать принцип ее работы) например:
$prev_id = $request->getParam('prev_id');
/** элемент, который нужно отсортировать*/
$item;
$prev_el = Item_Model::find($prev_id);
$item->sorting($prev_el->sort_index + 1);

Как я это вижу: у элемента есть метод, например, placeAfter, в качестве параметра ему передается элемент, после которого хотим поместить этот:
$item->placeAfter(Item_Model::find($prev_id));

У кого какие мнения на этот счет. Может оба эти варианта не удачны, и у вас свое видение решения задачи?
Valick
вашпе ничего не понятно smile.gif
давайте для начала выясним, что из себя представляет поле sort_index, тип и формат.

_____________
Стимулятор ~yoomoney - 41001303250491
kaww
Valick,
sort_index - integer, по которому выполняется сортировка:
select * from items order by sort_index

но это не важно, интересует как по вашему удобно выполнять сортировку. Т.е. абстрагироваться от самого механизма, а лишь сказать как хотелось бы.
Valick
для того чтобы абстрагироваться от самого механизма, надо знать от чего абстрагироваться
вас интересует как оформить ссылку с GET параметром?

_____________
Стимулятор ~yoomoney - 41001303250491
kaww
Цитата
вас интересует как оформить ссылку с GET параметром?

нет, это уже следствие.
Например, %some_user%: "Я считаю, что удобно передавать элемент после которого нужно расположить текущий. вот так: $item->placeAfter($prevItem)"
тогда можно будет сортировать элементы так: index/?item_id=100&prev_item_id=8000.
Valick
Цитата
тогда можно будет сортировать элементы так: index/?item_id=100&prev_item_id=8000

это точно сортировка? похоже на выборку от 100 до 8000
или 8000 записей с шагом 100?
или 100 записей с шагом 8000?
или еще что...
сорь, сегодня я не экстрасенс, ночь трудная была smile.gif smile.gif smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
Игорь_Vasinsky
наверн это значит

поставить элемент с id=100 перед элементом у которого позиция 8000

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
kaww
что то я как-то хреново изъясняюсь...
Есть таблица в в которой хранятся, например, товары. На страницах сайта они выводятся отсортированными по sort_index (select * from items order by sort_index). В админке есть возможность сортировки товаров (изменение значения sort_index), например, так http://jqueryui.com/sortable/. На пхп это выглядит так:
$prev_id = $request->getParam('prev_id');
/** элемент, который нужно отсортировать*/
$item;
$prev_el = Item_Model::find($prev_id);
$item->sorting($prev_el->sort_index + 1);

, что как я уже говорил, не совсем удобно (нужно знать, что для сортировки используется поле sort_index и т.д.). Как вариант можно определить метод, который принимает в качестве параметра предыдущий элемент и устанавливает нужный sort_index для текущего товара, и пересчитывает sort_index для всех остальных товаров, участвующих в операции (находятся до/после prev_item).

Пока писал понял, что это скорее всего самый оптимальный вариант
kaww
Цитата
наверн это значит

поставить элемент с id=100 перед элементом у которого позиция 8000

у которого ид 8000
Игорь_Vasinsky
id | sort_index
1 | 1
2 | 2
3 | 3
4 | 4
5 | 5
6 | 6
7 | 7
8 | 8
9 | 9
10 | 10

ну захотел ты переместить элемент с id=3 с позицией 3 на позицию 2
следо-но id=3 должен стать на позицию 2 - а все последующие двинуться на + 1 - так?

или по твоей задумке тупо с 3 на 2 меняется, а 2 на 3? как то не очень



_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
tomash
Можно сделать таблицу вида id, prev_id, next_id
тогда при добавлении или смене места товара не нужно обновлять все записи

собственно сортировать при выборке нужно по next_id, также можно получать список вверх или вниз от определенного идшника

_____________
Чтобы понять, что такое рекурсия - нужно понять, что такое рекурсия.
tomash
при вставке, удалении нужно провести инсерт и два апдейта. При перемещении по-моему 5 апдейтов(количество записей проадейтить)

_____________
Чтобы понять, что такое рекурсия - нужно понять, что такое рекурсия.
kaww
id | sort_index
1 | 1
2 | 2
3 | 3
4 | 4
5 | 5
6 | 6
7 | 7
8 | 8
9 | 9
10 | 10

например, нужно 5 поставить после 2
Для этого элементам с sort_index от 3 до 4 делаем sort_index = sort_index+1а элементу 5 sort_index = 3
tomash
kaww
т.е. если я переставлю 1000 елемент на первое место мне придется проапдейтить 1000 записей?

_____________
Чтобы понять, что такое рекурсия - нужно понять, что такое рекурсия.
kaww
tomash,
да, но это ведь не так уж и страшно и всего один запрос
update sort_index = sort_index+1 where sort_index > 'min' and  sort_index < 'max'

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.