使用PDO / MySQL获取的不仅仅是最后一个插入ID

时间:2012-07-14 21:14:57

标签: php mysql pdo

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

通常这会像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构造一个查询?

2 个答案:

答案 0 :(得分:1)

检查DoctrinePropel

它们是两个非常着名的对象关系映射器,它们具有基本PDO。 ORM's可以做你所要求的,并且有很多其他你会喜欢的功能,检查一下。

答案 1 :(得分:1)

“标题”不属于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}");

标题会一直存在内存中,直到您释放对象,无需保存并然后从数据库中检索它?