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

使用PHP更改数据库记录排序顺序,以便在其他记录之间移动记录位置,php,mysql,sorting,Php,Mysql,Sorting,我有一个项目管理PHP/MySQL/JavaScript应用程序,它有项目任务列表,有任务记录 Tak列表名称/标题只不过是一个任务记录,其数据库列指示它将用作标题/列表名称,然后任务记录可以根据排序顺序数据库列组织在单独的任务列表下 因此,根据下面的演示,该演示由17条任务记录组成,3条是任务列表记录 ID | TASK NAME | Sort Order 01 | - Task list 1 | 1 02 | --- task item 1 | 2 0

我有一个项目管理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
< P> >考虑我想更新<代码>任务项13 <代码> > <代码> ID=16 < /COD>和<代码>排序16 < /C> >并更新其排序顺序,使其“移动”任务记录到<代码>任务列表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);
如果您能提供任何帮助,我将不胜感激,因为我不知道该怎么做?

经过一番思考,我认为这里可能涉及到

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

  • 将任务项13从列表3移动到列表1。查询DB并获取我们要移动到的列表之后的下一个列表的排序顺序值。所以得到列表2的排序顺序,它是7
  • 现在,从列表2的排序顺序中减去-1,这就给出了
    任务项13的排序顺序必须更改为的数字,以便将其移动到
    列表1
  • 现在
    任务项13
    任务列表2记录
    的排序顺序都是
    7
  • 因此,从任务列表2开始,记录及其之后的所有记录都需要将排序顺序号增加+1

  • 有没有关于如何做到这一点的建议,我上面的步骤听起来是否正确?我再次意识到这不是最好的结构,但我正在尝试使它在现有系统上工作

    我想这会工作,但我想我应该为“排序顺序”添加一列,而不是混淆id:o,并假设您使用PDO作为$this->db-我想诀窍是给newid的当前所有者一个临时id,然后将旧ID移动到新ID,然后将临时ID移动到旧ID

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

    我想这是可行的,但我想我应该为“排序顺序”添加一个列,而不是与IDs:o混淆,并假设您使用PDO作为$this->db-我想诀窍是给newid的当前所有者一个临时id,然后将oldid移动到newid,然后将tempid移动到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)
    }
    

    看看其他人是如何使用mysqlam管理拖放排序表的,我错了,还是您这里有一个表可供儿童多用?好的,不要做这个重新整理排序列的事情。有人会用它来解决更大的问题,成为foobar'd@DrewPierce你说的没错,这不是理想的最好的解决方案,但在这个现有的项目中,我试图不改变它,暂时生活下去。他们使用1个表格来记录任务记录和任务列表/标题记录。所有记录都有一个
    sort\u order
    DB列,其中任务列表标题只需拖放到任务记录之间,即可将它们分开并显示在
    列表中。我意识到正确的方法是创建一个新的TaskLists DB表,但目前我对这样做很感兴趣being@Strawberry拖放排序表已经可以正常工作了。我试图在代码中找到一种方法,在其他项目之间移动和重新定位项目,所有这些都是用代码实现的。u将在“任务项13”所在的位置有一个洞。也许你想更进一步了解其他人是如何使用mysqlam管理拖放排序表的我弄错了,或者你这里有一张可以与孩子们一起使用的表吗?好的,不要做这个重新整理排序列的事情。有人会用它来解决更大的问题,成为foobar'd@DrewPierce你说的没错,这不是理想的最好的解决方案,但在这个现有的项目中,我试图不改变它,暂时生活下去。他们使用1个表格来记录任务记录和任务列表/标题记录。所有记录都有一个
    sort\u order
    DB列,其中任务列表标题只需拖放到任务记录之间,即可将它们分开并显示在
    列表中。我意识到正确的方法是创建一个新的TaskLists DB表,但目前我对这样做很感兴趣being@Strawberry拖放排序表已经可以正常工作了。我试图在代码中找到一种方法,在其他项目之间移动和重新定位项目,所有这些都是用代码实现的。u将在“任务项13”所在的位置有一个洞。也许你想更进一步了解其他人是如何使用mysqlam管理拖放排序表的我弄错了,或者你这里有一张可以与孩子们一起使用的表吗?好的,不要做这个重新整理排序列的事情。有人会用它来解决更大的问题,成为foobar'd@DrewPierce你说的没错,这不是理想的最好的解决方案,但在这个现有的项目中,我试图不改变它,暂时生活下去。他们使用1个表格来记录任务记录和任务列表/标题记录。所有记录都有一个
    sort\u order
    DB列,其中任务列表标题只需拖放到任务记录之间,即可将它们分开并显示在
    列表中。我意识到正确的方法是创建一个新的TaskLists DB表,但目前我对这样做很感兴趣being@Strawberry拖放排序表已经可以正常工作了。我试图在代码中找到一种方法,在其他项目之间移动和重新定位项目,所有这些都是用代码实现的。u将在“任务项13”所在的位置有一个洞。我想把它收紧