2013-06-26 82 views
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

完整的源代碼是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 

感謝

回答

0

我猜你的目標是優化(MySQL的?)請求的數量,不是嗎?

我認爲這是不可能的,主要是因爲Propel對象保存依賴於其他步驟 - 想到preSave(),postSave(),行爲也需要爲每個對象執行一次保存查詢。

通過嘗試進行優化查詢,您將失去Propel保存工作流和關係管理的好處。

另一方面,我不確定clearTags()真正的工作方式,我認爲它只是刪除對象引用,但不刪除數據庫中的記錄。

您必須在您的BasePost.php文件中使用setTags()方法,該方法實際上會替換您提供的新對象集合中的任何先前關係。

+0

目標沒有優化。目標是重新保存標籤。我將檢查'setTags'。謝謝 –

+0

我已更新,我會嘗試更多變化。 –

+0

'setTags'不起作用。查看問題中更新的運行時錯誤。 –

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] 

他們每個人都已經是數據庫了,所以如果四次都會先輸入。

問題是隻有第二,第三和第四個將被保存。不會有第一個。爲什麼?

另一個例子是,如果我有數組[第一],並做同樣的事情(首先是在數據庫已經)它將被保存每一次只有第二次。所以我有......就像是在數據庫中,數據庫爲空,在數據庫中,數據庫爲空,每次請求嘗試。