如何在学说中重新编号列

时间:2015-03-30 20:12:05

标签: php mysql doctrine-orm

我正在使用doctrine在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的字段,该字段是自动编号字段,
  3. 加入id字段上的表格并更新current_table.order = new_table.new_order
  4. 删除临时表。
  5. 循环浏览记录并一次更新一个:

    $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
    }
    

    还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

非常,当然,请使用第二种方法...... I.E.循环记录并更新。

不使用临时表的快速原因:

  • 如果您正在使用MySQL临时表,则当前会话可以看到它;如果您使用持久连接,实际上可以由多个会话共享。如果同时运行脚本两次,可能会导致某些数据损坏。同样的事情也适用于创建真实的表格。

你应该做的是:

  1. 检索所有数据,或至少以逻辑批次检索它们(在这种情况下,可以通过仅检索特定"集合"的行来完成,例如水果)
  2. 对行进行排序(这也可以在SQL查询中先前完成)
  3. 使用计数器更新行,与您提议的完全一样