1

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

$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

完整的源代码在这里

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

第一优先。

优化是第二要务。

更新2:

我用收到的回复修改了代码,如下所示

$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 

谢谢

4

2 回答 2

0

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

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

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

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

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

于 2013-06-26T13:45:27.970 回答
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()

在这里查看我的问题

更具体地说,假设我在$tagsArray.

[first, second, third, fourth]

他们每个人都已经是数据库,所以如果四次它会先进入。

问题是只有第二个、第三个和第四个会被保存。不会有第一个。为什么?

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

于 2014-04-30T09:37:01.683 回答