推动保存标签

时间:2013-06-26 04:36:11

标签: propel

我有一个Post模型,我正在为下面的帖子插入标签。在我编辑时,可能会删除一些标签。那么删除标签并重新插入的正确方法是什么?

$post->setTitle($data['title']);
$post->setBody($data['body']);
$post->setSlug($data['slug']);
$tags = explode(',', $data['tags']);
// Want to remove the tags
foreach ($tags as $tag) {
    $tagobj = TagQuery::create()->findOneByName($tag);
    if (! $tagobj) {
         $tagobj = new Tag();
         $tagobj->setName($tag);
         $tagobj->save();
    }
    $post->addTag($tagobj);
}
$post->save();

推进是否可以在单个查询中插入,或者这是最糟糕的方法。

我在推进组中提出了问题,但是:-(https://groups.google.com/d/msg/propel-users/x6PH_DwLtVE/H84o1cu4W4kJ

完整的源代码是here

目标是在删除一个标记或添加一个标记时重新保存标记。该怎么办 ?

第一优先。

优化是第二优先。

Update2:

我使用我收到的回复

将代码修改为如下所示
$tags = explode(',', $data['tags']);
foreach ($tags as $tag) {
    $tagobj = TagQuery::create()->findOneByName($tag);
    if (! $tagobj) {
        $tagobj = new Tag();
        $tagobj->setName($tag);
        $tagobj->save();
    }
}
// var_dump($tags);
$tagcollection = TagQuery::create()->findByName($tags);
// var_dump($tagcollection);
// exit;
$post->setTags($tagcollection);

现在我得到数组到字符串转换错误。

Notice: Array to string conversion in /var/www/harisample/vendor/propel/propel/src/Propel/Runtime/Connection/StatementWrapper.php on 
line 171 Call Stack: 0.0001 131940 

 {main}() /var/www/harisample/web/index.php:0 0.0243 1259056 

 Aura\Framework\Bootstrap\Web->exec() /var/www/harisample/web/index.php:13 0.0243 1259108 

 Aura\Framework\Web\Controller\Front->exec() /var/www/harisample/package/Aura.Framework/src/Aura/Framework/Bootstrap/Web.php:71 0.0243 1259436 

 Aura\Framework\Web\Controller\Front->request() /var/www/harisample/package/Aura.Framework/src/Aura/Framework/Web/Controller/Front.php:168 0.0314 1694584 

 Aura\Web\Controller\AbstractPage->exec() /var/www/harisample/package/Aura.Framework/src/Aura/Framework/Web/Controller/Front.php:222 0.0316 1699500 
Aura\Web\Controller\AbstractPage->action() /var/www/harisample/package/Aura.Web/src/Aura/Web/Controller/AbstractPage.php:168 0.0316 1699576 
Aura\Web\Controller\AbstractPage->invokeMethod() /var/www/harisample/package/Aura.Web/src/Aura/Web/Controller/AbstractPage.php:206 0.0316 1699960 
ReflectionMethod->invokeArgs() /var/www/harisample/package/Aura.Web/src/Aura/Web/Controller/AbstractPage.php:231 0.0316 1699976 
 Hari\Sample\Web\Post\Page->actionEdit() /var/www/harisample/package/Aura.Web/src/Aura/Web/Controller/AbstractPage.php:231 0.0856 5802116 1
 Hari\Sample\Model\Base\Post->save() /var/www/harisample/package/Hari.Sample/src/Hari/Sample/Web/Post/Page.php:127 0.0874 5808356 1
 Hari\Sample\Model\Base\Post->doSave() /var/www/harisample/package/Hari.Sample/src/Hari/Sample/Model/Base/Post.php:930 0.0881 5813420 1
 Hari\Sample\Model\Base\PostTagQuery->delete() /var/www/harisample/package/Hari.Sample/src/Hari/Sample/Model/Base/Post.php:1000 0.0881 5813700 1
 Propel\Runtime\ActiveQuery\ModelCriteria->delete() /var/www/harisample/package/Hari.Sample/src/Hari/Sample/Model/Base/PostTagQuery.php:557 0.0881 5814628 1
 Propel\Runtime\ActiveQuery\Criteria->doDelete() /var/www/harisample/vendor/propel/propel/src/Propel/Runtime/ActiveQuery/ModelCriteria.php:1324 0.0883 5817716 1
 Propel\Runtime\Connection\StatementWrapper->execute() /var/www/harisample/vendor/propel/propel/src/Propel/Runtime/ActiveQuery/Criteria.php:2408 0.0883 5817772 1
 PDOStatement->execute() /var/www/harisample/vendor/propel/propel/src/Propel/Runtime/Connection/StatementWrapper.php:171 

由于

2 个答案:

答案 0 :(得分:0)

我猜你的目标是优化(mysql?)请求的数量,不是吗?

我认为这是不可能的,主要是因为Propel对象保存依赖于其他步骤 - 想想preSave(),postSave(),行为也 - 需要为每个对象执行一次保存查询。

通过尝试进行优化查询,您将失去Propel保存工作流程和关系管理的好处。

另一方面,我不确定clearTags()的实际工作方式,我认为它只是删除对象引用但不删除数据库中的记录。

您必须在BasePost.php文件中使用setTags()方法,该方法实际上将替换您提供的新对象集合之前的任何关系。

答案 1 :(得分:0)

我正在做类似的事,但仍然有些不好。也许你可以试试,也许它会对你的项目起作用。

$tagNames = $tags->getTags();
$tagsArray = explode(',', $tagNames);

$postTagToDelete = PostTagQuery::create()->filterByPostId($post->getId())->find();
if ($postTagToDelete) {
    $postTagToDelete->delete();
}

foreach ($tagsArray as $tagName) {
    $tag = TagQuery::create()->filterByName($tagName)->findOne();
    //when i find an existing tag,
    // there is no need to create another one
    //I just simply add it **(it's not working here)**
    if ($tag != null) {
        $post->addTag($tag);

    } else {
        //when tag is new
        $tag = new Tag();
        $tag->setName($tagName);


        $post->addTag($tag);

    }
}
$post->save()

请参阅my problem here

更具体地说,让我假装我在$tagsArray中有四个元素。

[first, second, third, fourth]

它们中的每一个都已经是数据库,因此如果四次进入,它将首先进入。

问题是只会保存第二,第三和第四。没有第一个。为什么呢?

另一个例子是,如果我有数组[first]并且做同样的事情(首先是已经在数据库中),它将仅在第二次保存。所以我就像是在数据库中,数据库为空,在数据库中,数据库为空,[...]每次请求尝试。