0

私は所有者と車の間にmany_many関係(これにはmanymanydataobjectmanagerを使用できません)でdataobjectmanagerを使用しています。新しい車が作成されるたびに、所有者のすべてのインスタンスを反復処理し、そのIDを新しい車のIDとともにリンクされたテーブルに追加します。

私の問題は、これを行うためのコードがonafterwriteメソッド内にあり、2回呼び出されることです。理由はわかりません。また、私の3人の所有者にとって、リンクされたテーブルに奇妙な行を作成していることに気づきました。最初の2つのIDが順番になり、次に1つが固定されます。したがって、3行なしで1行目、2行目、4行目になります。

これは私のonAfterWriteメソッドです

public function onAfterWrite() {

    if(Permission::check('ADMIN')){
        $Pages = DataObject::get('Owner');              

        foreach($Pages as $owner) {

        DB::query("INSERT INTO Owner_Cars (OwnerID, CarID) VALUES ('". $owner->ID . "', '" . $this->ID . "')");
        }
    }
    else {
        echo "Failure";
        return false;
    }
    return parent::onAfterWrite();
}

何かアドバイスをいただければ幸いです。

ありがとう

4

1 に答える 1

3

が2回呼び出されるため、onAfterWrite()メソッドはおそらく2回write()呼び出されます。これが発生する最も一般的な理由は次のとおりです。

  • write()がたまたまIDを生成します
  • 次に、そのIDに依存する関連レコードの保存の一部として別のwrite()が発生します。

一般に、AfterWrite()が1回呼び出されることに依存することはできないと思います。write()は、古い回数だけ呼び出すことができるように設計されており、変更があった場合にのみデータベースに実際に影響します。作られる。

これと互換性を持たせるには、コードで必要なDELETE、INSERT、またはUPDATEステートメントを呼び出す必要があります。たとえば、次のようになります。

  • OwnerID = $owner->IDであるすべてのOwner_Carsレコードを選択します
  • $Pagesリストにないものを削除します
  • まだOwner_Carsにない$Pageリストから何かを挿入します

可能であれば、SilverStripe 3を試してみることをお勧めします。SilverStripe3のGridFieldは、この種のものを箱から出してより堅牢に処理し、その上でアプリを構築する方が簡単な場合があります。

于 2012-10-14T23:14:31.080 に答える