2016-06-13 6 views
1

、私は2つのモデルがあります:私は、私は新しい碑文のためのテストを作成InscriptionsTable、中afterSave()コールバックを持ってCakePHPの3つのコールバックシステムと関連するエンティティ

Inscriptions hasMany Tests 

:碑文とテストを:

public function afterSave($event, $inscription, $options) { 

    // find out which tests I need to create (based on Inscription fields) 
    $tests = ...; 

    foreach($tests as $t) { 

    $test = $testTable->newEntity([ 
     ... 
     'inscription_id' => $inscription->id 
    ]); 

    $testTable->save($test) 

    } 
} 

...覚え書きが保存されると、必要な関連テストもすべて作成され、碑文を参照します。

これでうまくいきましたが、新しい碑文を保存すると、afterSaveコールバックが複数回発生することに気付きました。碑文エンティティの1時間を発射ようだ、と作成された各テストのために再び火災、ライン

$testTable->save($test) 

かのような... InscriptionsTable :: afterSave()コールバックをトリガします。

私は[callbacks '=> FALSE]をsave()(CakePHP 2のように)の2番目のパラメータとして追加しようとしましたが、何も変更されませんでした。

ここで何が起こっている可能性がありますか?

おかげ

EDIT

Konstantinos Daskalopoulos answerhttp://book.cakephp.org/3.0/en/orm/saving-data.html#saving-entitiesの正しい(と受け入れられた)、完全な説明、「( "実体はいくつかのことが起こる保存されている" リスト上の の点6であります6.親の団体は保存されています ")。だから私はそれが私が見ていることを説明すると思います。

+0

正確に何が起こるかを理解するには、コールバックがどこから呼び出されているのかを実際に把握できるように、stacktrace( '\ Cake \ Error \ Debugger :: trace()')をコールバックに記録します。また、CakePHP3には 'callbacks'オプションはありません.btwでは、代わりに' beforeSave'を使ってメインエンティティに関連するデータを作成し、Cakeにすべてを一度に保存させることもできます。 – ndm

答えて

0
私はこのシナリオを考えることができ

  • 協会(テスト)が碑文に対して保存されているときに行う$ testTable->保存($テスト)、ラインの背後にあるので、$ testTable->保存( $ test)は$ inscriptions-> save($ test)を呼び出しています。この場合、saving dataのように - > save()の代わりに - > update()を使用すると、updateはafterSaveイベントをトリガーしません。
関連する問題