Propel ORM在单次保存中添加多对多关系数据

时间:2013-04-16 09:40:19

标签: mysql many-to-many propel relation

我有一个帖子和类别模型与category_post表

有很多对很多关系

在实际场景中,我想添加一个包含多个现有类别ID的帖子  例如

发帖

   $postobj = new Post();
   $postobj->setTitle("First title");
   $postobj->setContent("First title");

我还有现有的id

类别
    $category_id = array(8,9,17,39)

我想在一个保存功能中保存上述类别的帖子,例如

  $postobj->save();

我无法弄清楚我们怎么做到这一点?

1 个答案:

答案 0 :(得分:1)

好的,所以在测试之后看起来像Propel WILL会在一个事务中执行如下所示的代码,但不会执行一个数据库命中。然而,这可能是使用Propel执行此操作的最有效方法:

$postobj = new Post();
$postobj->setTitle("First title");
$postobj->setContent("First title");

$category_id = array(8,9,17,39)
for ($i=0,$l=sizeof($category_id); $i<$l; ++$i) {
  $cp = new CategoryPost();
  $cp->setPost($postobj);
  $cp->setCategoryId($category_id[$i]);
  $postobj->addCategoryPost($cp);
}
$postobj->save(); // this will save the Post AND the CategoryPost objects

<强>更新 如果您想将此代码放入一个允许传入一些数据并保存的辅助函数中,那么您可以这样做(警告:这是未经测试的,请小心):

class Post extends BasePost
{
  public function saveAllData($data, PropelPDO $con = null) {
    // might want to do some audits on input..
    $this->fromArray($data); // catches most data

    // add relationships
    if (isset($data['categoryIds']) && is_array($data['categoryIds'])) {
      for ($i=0,$l=sizeof($data['categoryIds']); $i<$l; ++$i) {
        $cp = new CategoryPost();
        $cp->setPost($this);
        $cp->setCategoryId($data['categoryIds'][$i]);
        $this->addCategoryPost($cp);
      }
    }

    // do the save
    // NOTE: you might want to do validations first, etc
    return $this->save($con);
  }
}

然后你会从你的脚本中调用它:

...
$data = array(
  "ColumnName"=>"value", // NOTE: the ColumnName must match the Propel column
  ...
  "CategoryIds"=>array(2,3,4,5)
);
$post = new Post();
$post->saveAllData($data); // careful, this could throw Exceptions