Как перенумеровать колонку в доктрине

Я разрабатываю проект в zf2 с помощью доктрины, и мне нужно создать метод для нумерации поля order чтобы значения были последовательными. До:

 +-----+-------+--------+------------+ | id | order | item | collection | +-----+-------+--------+------------+ | 987 | 1 | apple | fruits | | 46 | 2 | banana | fruits | | 394 | 7 | grape | fruits | | 265 | 30 | pear | fruits | | 89 | 1 | squash | vegetables | +-----+-------+--------+------------+ 

После:

 +-----+-------+--------+------------+ | id | order | item | collection | +-----+-------+--------+------------+ | 987 | 1 | apple | fruits | | 46 | 2 | banana | fruits | | 394 | 3 | grape | fruits | | 265 | 4 | pear | fruits | | 89 | 1 | squash | vegetables | +-----+-------+--------+------------+ 

Последовательности порядка – по collection , но мне не нужен метод для нумерации всего набора данных; просто записи в конкретной коллекции.

Некоторые из решений, которые я рассматриваю, включают:

Временная таблица:

  1. Сбросьте соответствующие записи в новую таблицу,
  2. Добавьте поле new_order которое является полем new_order ,
  3. Присоедините таблицы к полю id и обновите current_table.order = new_table.new_order ,
  4. Удалите временную таблицу.

Цикл через записи и обновление по одному:

 $collection = … // results from select query where collection=fruits n = 1; For each ($collection as $item) { // update query to set order=n where id=$item[id] n += 1 } 

Любые другие мысли?

Очень, определенно, пожалуйста, используйте второй метод … IE цикл через записи и обновление.

Быстрая причина не использовать временные таблицы:

  • Если вы используете временную таблицу MySQL, она видна для текущего сеанса; которые могут быть разделены несколькими сеансами, если вы используете постоянные соединения. Если вы одновременно запускаете сценарий одновременно, это может привести к некоторому повреждению данных. То же самое относится к созданию реальных таблиц.

Что вам нужно сделать:

  1. Извлеките все свои данные или, по крайней мере, получите их в логических партиях (в этом случае это может быть сделано путем извлечения только строк определенной «коллекции», например, фруктов)
  2. Закажите строки (это также можно было сделать ранее в SQL-запросе)
  3. Обновите строки с помощью счетчика, точно так же, как вы предложили