2012-07-14 85 views
0

我正在编写一个小型框架,我的目标是让我的开发人员在添加/插入资源之后轻松设置重定向到资源的详细信息页面。使用PDO/MySQL获取不止最后一个插入ID使用PDO/MySQL获取不止最后一个插入ID

通常,这将与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 = $这个 - > TournamentModel-> lastInsert();

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

是否有这样的事情存在?或者至少有一个PDO方法返回插入的表,以便我可以使用表名和ID构造一个查询?

+0

插入后,从上一个插入ID中选择所需的所有字段 – 2012-07-14 21:25:37

回答

1

检查DoctrinePropel

它们是两个非常有名的对象关系映射器,它们都以PDO为基础。 ORM's可以做你所问的,并有许多其他功能,你会喜欢,检查它。

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

标题在内存中坚持直到你释放对象,没有必要保存并且然后从数据库中检索