1

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();

propelは単一のクエリに挿入できますか、それともこれは最悪のアプローチですか.

propelグループで質問したことがありますが、:-( https://groups.google.com/d/msg/propel-users/x6PH_DwLtVE/H84o1cu4W4kJ

完全なソースコードはこちら

目標は、1 つのタグが削除されるか、1 つのタグが追加されたときに、タグを再保存することです。何をすべきか ?.

最優先。

最適化は 2 番目の優先事項です。

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 

ありがとう

4

2 に答える 2

0

あなたの目標は(mysql?)リクエストの数を最適化することだと思いますね。

主に、Propel オブジェクトの保存が他のステップに依存しているため (preSave()、postSave()、ビヘイビアも考えてください)、すべてのオブジェクトに対して単一の保存クエリの実行が必要であるため、これは不可能だと思います。

最適化されたクエリを作成しようとすると、Propel の保存ワークフローとリレーション管理の利点が失われます。

一方、clearTags()実際に機能する方法についてはよくわかりません。オブジェクト参照を削除するだけで、データベース内のレコードは削除しないと思います。

BasePost.php ファイルにはsetTags()、以前のリレーションを提供する新しいオブジェクト コレクションに実際に置き換えるメソッドが必要です。

于 2013-06-26T13:45:27.970 に答える
0

sth も似たようなものにしていますが、それでも何かが良くありません。あなたのプロジェクトでうまくいくかもしれません。

$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()

ここで私の問題を参照してください。

より具体的に言うと、 に 4 つの要素があるとし$tagsArrayます。

[first, second, third, fourth]

それらのすべてはすでにデータベースであるため、最初に入力するのは 4 回です。

問題は、2 番目、3 番目、4 番目だけが保存されることです。最初はありません。なんで?

もう 1 つの例は、array[first] があり、同じことを行うと (最初は既にデータベースにあります)、2 回目だけ保存されます。だから私はsthがデータベースにある、データベースが空である、データベースにある、データベースが空である、[...]すべてのリクエスト試行を持っています。

于 2014-04-30T09:37:01.683 に答える