Zend DB插入关系数据

时间:2012-09-04 08:49:17

标签: zend-framework zend-db

我现在正在使用Zend Framework数据库关系几周。我的第一印象非常好,但我确实有一个与将相关数据插入多个表有关的问题。对于一个小测试应用程序,我通过使用熔丝表将两个表相互关联。

      +---------------+      +---------------+      +---------------+
      |     Pages     |      |     Fuse      |      |    Prints     |
      +---------------+      +---------------+      +---------------+
      | pageid        |      | fuseid        |      | printid       |
      | page_active   |      | fuse_page     |      | print_title   |
      | page_author   |      | fuse_print    |      | print_content |
      | page_created  |      | fuse_locale   |      | ...           |
      | ...           |      | ...           |      +---------------+
      +---------------+      +---------------+

上面是我的数据库架构的一个例子

现在,我的问题是如何将相关数据插入到两个单独的表中,并同时将两个新创建的ID插入到保险丝表中。如果有人可以解释或给我一个主题相关的教程。我很感激!

2 个答案:

答案 0 :(得分:1)

我假设你为每张桌子设置了单独的模型。然后只需在Prints表中插入东西,将返回的ID存储在变量中。然后在Pages表中插入东西并将返回的ID存储在另一个变量中。最终在Fuse表中插入数据。这里不需要任何“同时”(原子)操作。新插入的行的ID由save()返回(我假设您为此使用自动增量字段)。

$printsModel = new Application_Model_Prints();
$pagesModel = new Application_Model_Pages();
$fuseModel = new Application_Model_Fuse();

$printData = array('print_title'=>'foo',
              ...);
$printId = $printsModel->insert( $printData );

$pagesData = array('page_author'=>'bar',
              ...);
$pageId = $pagesModel->insert($pagesData);

$fuseData = array('fuse_page' => $pageId,
                  'fuse_print' => $printId,
                  ...);
$fuseId = $fuseModel->insert($fuseData);

因此是伪代码,因此您可能希望将插入移动到模型中并执行somoe即标准化等。

我还建议更多关注字段命名约定。它通常有帮助,现在你得到了fuseid,但fuse_page。所以它应该是fuse_idfusepage(更不用说我怀疑这个字段存储了ID,因此它会是fuse_page_idfusepageid)。

答案 1 :(得分:0)

Prints和Pages是两个实体。为每个

创建行类
class Model_Page extends Zend_Db_Table_Row_Abastract 
{

public function addPrint($print)
{
  $fuseTb = new Table_Fuse();
  $fuse = $fuseTb->createRow();
  $fuse->fuse_page = $this->pageid;
  $fuse->fuse_print = $print->printid;
  $fuse->save();
  return $fuse;
}

}

现在当你创建页面

$page = $pageTb->createRow() ; //instance of Model_Page is returned
$page->addPrint($printTb->find(1)->current());