【问题标题】:Get more than just last insert ID using PDO / MySQL使用 PDO / MySQL 获得的不仅仅是最后一个插入 ID
【发布时间】:2012-07-14 21:14:56
【问题描述】:

我正在编写一个小型框架,我的目标是让我的开发人员在添加/插入资源后,可以轻松地设置重定向到资源的详细信息页面。

通常这就像 PDO::lastInsertID() 一样简单,但我使用的不仅仅是 ID 来识别资源,我还使用资源名称/标题的格式化版本。

例如,一个新的锦标赛可能被称为“测试锦标赛”,因此它的资源 URI 将是 domain.com/tournament/328-test-tournament。

所以当我在插入后重定向时,我需要重定向到“328-test-tournament”,而不仅仅是“328”。这是出于 URL 完整性目的而设计的。我不希望人们使用不匹配的 ID 和标题访问单个资源。

也就是说,在我插入之后,我希望能够自动返回的不仅仅是 ID,而是我输入的整个数据集,这样我就可以格式化标题并重定向。

我可以在控制器中这样做:

$this->TournamentModel->insert();

$id = PDO::lastInsertID();
$title = my_title_formatting_function($_POST['title']);
@header("Location: domain.com/tournament/{$id}-{$title}");

但我想要一个稍微优雅一点的解决方案,像这样:

$id = $this->TournamentModel->lastInsert();

lastInsert 实际上是核心模型中的公共方法,它不仅检索最后一个插入的 id,而且检索整行。然后我会在那里处理标题格式和 id 连接。

这样的东西存在吗?或者至少有一个 PDO 方法可以返回插入的表,以便我可以使用表名和 id 构造查询?

【问题讨论】:

  • 插入后,从上次插入ID中选择你想要的所有字段

标签: php mysql pdo


【解决方案1】:

检查DoctrinePropel

它们是两个非常著名的对象关系映射器,具有作为基础 PDO。 ORM's 可以按照您的要求做,还有很多其他您会喜欢的功能,请检查一下。

【讨论】:

    【解决方案2】:

    “标题”不属于Tournament 对象吗?即

    class TournamenentModel {
      private $id;
      private $title;
    
      public function setTitle($title) {
        $this->title = $title;
      }
    
      public function getTitleFormatted() {
        return my_title_formatting_function($this->title);
      }
    }
    

    在这种情况下,您的插入方法可能类似于

    PDO::save(array('title' => $this->title));
    

    您的工作流程将遵循以下原则:

    $tournament = new TournamentModel();
    $tournament->setTitle($_POST['title']);
    $tournament->insert();
    
    $title = $tournament->getTitleFormatted();
    @header("Location: domain.com/tournament/{$id}-{$title}");
    

    标题在您释放对象之前一直保存在内存中,是否不需要保存并然后从数据库中检索它?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 2011-06-01
      • 2012-05-27
      相关资源
      最近更新 更多