使用PHP更改数据库记录的排序顺序,以便在其他记录之间移动记录位置


Change Database records sort order to move record position in between other records with PHP

我有一个项目管理PHP/MySQL/JavaScript应用程序,它有项目任务列表其中有任务记录

Tak列表名称/标题只不过是一个带有数据库列的任务记录,该列表明它将用作标题/列表名称,然后任务记录可以根据排序顺序数据库列

将任务记录组织在单独的任务列表中。

根据下面的演示,它由17组成任务记录3是任务列表记录

ID  | TASK NAME          | Sort Order
01  | - Task list 1      | 1
02  | --- task item 1    | 2
03  | --- task item 2    | 3
04  | --- task item 3    | 4
05  | --- task item 4    | 5
06  | --- task item 5    | 6
07  | - Task list 2      | 7
08  | --- task item 6    | 8
09  | --- task item 7    | 9
10  | --- task item 8    | 10
11  | --- task item 9    | 11
12  | --- task item 10   | 12
13  | - Task list 3      | 13
14  | --- task item 11   | 14
15  | --- task item 12   | 15
16  | --- task item 13   | 16
17  | --- task item 14   | 17
18  | --- task item 15   | 18

所以考虑这样一个场景,我想更新task item 13,即ID = 16sort order 16,并更新其排序顺序,以便它将任务记录"移动"到Task List 1

我想有一个简单的使用PHP函数来完成这种类型的移动任务记录到一个新的排序顺序,使它显示在一个新的任务列表下,像这样的工作:

/**
 * Move Task record to new Task List by ID
 * $taskId int Task ID number
 * $taskListId int Task List record ID number
 */
$task->moveTaskIdToListId($taskId, $taskListId);

我将感谢任何帮助,请,因为我不知道如何做到这一点?

经过一番思考,这是我认为可能涉及的…

完成将任务记录移动到新列表的可能步骤

  1. task item 13从列表3移动到列表1。查询DB并获取我们要移动到的下一个列表后的排序顺序值。因此,获取列表2的排序顺序,即7。
  2. 现在从列表2的排序顺序中减去-1,得到task item 13的排序顺序必须改变的数字,以便将其移动到list 1
  3. 现在task item 13Task list 2 record的排序顺序都是7
  4. 所以从Task list 2记录和之后的所有记录开始,需要将排序顺序数增加+1
关于如何做到这一点,有什么建议吗?我上面的步骤听起来对吗?我再次意识到这不是最好的结构但我正试图使它在现有系统上工作

我想这会起作用,但我想我会添加一列"排序顺序",而不是与id混淆:0,假设你使用PDO作为$this->db -我认为诀窍是给当前的newid所有者一个临时id,然后将oldid移动到newid,然后将temp移动到oldid

public function moveTaskIdToListId($oldid,$newid){
$this->db->beginTransaction();
$tmpid=$this->db->query('SELECT max(`id`) FROM `table`');
++$tmpid;
$this->db->query('UPDATE `table` SET `id` = '.$this->db->quote($tmpid).' WHERE `id` = '.$this->db->quote($newid));
$this->db->query('UPDATE `table` SET `id` = '.$this->db->quote($newid).' WHERE `id` = '.$this->db->quote($oldid));
$this->db->query('UPDATE `table` SET `id` = '.$this->db->quote($oldid).' WHERE `id` = '.$this->db->quote($tmpid));
$this->db->commit();
//todo: error handling and handle case when newid does not exist yet..(if that ever happens)
}