【问题标题】:Change Database records sort order to move record position in between other records with PHP更改数据库记录排序顺序以使用 PHP 在其他记录之间移动记录位置
【发布时间】:2015-08-18 08:35:04
【问题描述】:

我有一个项目管理 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

关于如何执行此操作的任何建议,我上面的步骤听起来是否正确?再次,我意识到这不是执行此操作的最佳结构,但我正在尝试使其在现有系统上运行

【问题讨论】:

  • 看看其他人如何使用 mysql 管理拖放排序
  • 是我弄错了,还是您这里有一张供儿童多用的桌子?好的,不要做这个 re-jigger 排序顺序列的事情。有人会用它来解决更大的问题并被 foobar'd
  • @DrewPierce 你是对的,提到它不是理想的最佳解决方案,但在这个现有的项目中,我试图不改变它并暂时使用它。他们使用 1 个表来记录任务记录和任务列表/标题记录。所有记录都有一个sort_order DB 列,其中任务列表标题只需在任务记录之间拖放即可将它们分开并显示在Lists 中。我意识到正确的方法是创建一个新的任务列表数据库表,但我暂时有兴趣这样做
  • @Strawberry 拖放排序已经可以正常工作了。我正在尝试在代码中提出一种方法来移动和重新定位其他项目之间的项目,所有项目都使用代码。
  • 听起来你很清楚该怎么做。你将有一个“任务项目 13”所在的洞。可能想收紧

标签: php mysql sorting


【解决方案1】:

我想这会起作用,但我想我会为“排序顺序”添加一个列,而不是弄乱 ID :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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2016-09-25
    • 2011-12-25
    相关资源
    最近更新 更多