0

1対多関係でテーブルにproductリンクされているテーブルがあります。同じテーブルで、i18nの動作もあります。これは、同じタイプの関係を持つ1対多の別のテーブルproduct_i18nを意味します。PropelORMPlugin(Propel 1.6)を使用しています。デフォルトでは、ファイルに次のメソッドが生成されます。product_imagedoSaveBaseProduct.php

protected function doSave(PropelPDO $con)
{
    $affectedRows = 0; // initialize var to track total num of affected rows
    if (!$this->alreadyInSave) {
        $this->alreadyInSave = true;

        // We call the save method on the following object(s) if they
        // were passed to this object by their coresponding set
        // method.  This object relates to these object(s) by a
        // foreign key reference.

        if ($this->aCategory !== null) {
            if ($this->aCategory->isModified() || $this->aCategory->isNew()) {
                $affectedRows += $this->aCategory->save($con);
            }
            $this->setCategory($this->aCategory);
        }

        if ($this->isNew() || $this->isModified()) {
            // persist changes
            if ($this->isNew()) {
                $this->doInsert($con);
            } else {
                $this->doUpdate($con);
            }
            $affectedRows += 1;
            $this->resetModified();
        }

        if ($this->productImagesScheduledForDeletion !== null) {
            if (!$this->productImagesScheduledForDeletion->isEmpty()) {
                ProductImageQuery::create()
                    ->filterByPrimaryKeys($this->productImagesScheduledForDeletion->getPrimaryKeys(false))
                    ->delete($con);
                $this->productImagesScheduledForDeletion = null;
            }
        }

        if ($this->collProductImages !== null) {
            foreach ($this->collProductImages as $referrerFK) {
                if (!$referrerFK->isDeleted()) {
                    $affectedRows += $referrerFK->save($con);
                }
            }
        }

        if ($this->productI18nsScheduledForDeletion !== null) {
            if (!$this->productI18nsScheduledForDeletion->isEmpty()) {
                ProductI18nQuery::create()
                    ->filterByPrimaryKeys($this->productI18nsScheduledForDeletion->getPrimaryKeys(false))
                    ->delete($con);
                $this->productI18nsScheduledForDeletion = null;
            }
        }

        if ($this->collProductI18ns !== null) {
            foreach ($this->collProductI18ns as $referrerFK) {
                if (!$referrerFK->isDeleted()) {
                    $affectedRows += $referrerFK->save($con);
                }
            }
        }

        $this->alreadyInSave = false;

    }

    return $affectedRows;
}

オブジェクトテーブルに保存するとき(を保存するとき)ProductI18nにオブジェクトのプロパティにアクセスする必要があります。問題は、オブジェクトがオブジェクトのに保存されることです。が新しい場合、プロパティが空であることを意味します(他のいくつかのプロパティに基づいてオブジェクトを保存するときに、そのプロパティが入力されるため)。Propelが関連オブジェクトの保存順序を生成する方法を変更する方法はありますか?メソッドを書き直さずにこれを機能させる他の方法はありますか?ProductImageProductProductI18nProductImageProductProductI18ndoSave

4

1 に答える 1

0

スキーマファイルのエントリを並べ替えることでこれを機能させるためのトリックがあるかもしれませんがforeign-key、これは壊れやすい可能性があります(誰かが再度並べ替えると、コードが壊れます)。postInsertクラスのフックを使用し、ProductImage関連するエントリにアクセスしProductI18nてスラッグを取得し(まだ持っていない場合)、ProductImage再度保存する方が簡単な場合があります(効率的でない場合)。

class ProductImage extends BaseProductImage {
  ...
  public function postInsert(PropelPDO $con = null) {
    if (!$this->getSlug()) {
      // get the slug from ProductI18n and update $this, then call ->save();
    }
  }
  ...
}
于 2013-01-09T16:14:24.040 に答える