我有一个帖子和类别模型与category_post表
有很多对很多关系在实际场景中,我想添加一个包含多个现有类别ID的帖子 例如
发帖
$postobj = new Post();
$postobj->setTitle("First title");
$postobj->setContent("First title");
我还有现有的id
类别 $category_id = array(8,9,17,39)
我想在一个保存功能中保存上述类别的帖子,例如
$postobj->save();
我无法弄清楚我们怎么做到这一点?
答案 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