【问题标题】:CakePHP 3 callbacks system and related entitiesCakePHP 3 回调系统和相关实体
【发布时间】:2016-06-13 12:36:43
【问题描述】:

使用 CakePHP 3,我有 2 个模型:铭文和测试:

Inscriptions hasMany Tests

我在 InscriptionsTable 中有一个 afterSave() 回调,我在其中为新 Inscription 创建测试:

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)

  }
}

...所以当一个 Inscription 被保存时,所有需要的相关测试也会被创建并且它们引用 Inscription。

它工作正常,但现在我注意到当我保存一个新的 Inscription 时,afterSave 回调会被触发多次。似乎它为 Inscription 实体触发一次,然后为每个创建的 Test 再次触发,就像行

$testTable->save($test)

...触发 InscriptionsTable::afterSave() 回调。

我尝试添加 ['callbacks' => FALSE] 作为 save() 的第二个参数(就像在 CakePHP 2 中一样),没有任何改变。

这里会发生什么?

谢谢

编辑

Konstantinos Daskalopoulos answer 是正确的(并且被接受),完整的解释 http://book.cakephp.org/3.0/en/orm/saving-data.html#saving-entities, 点 6. 在列表“保存实体时会发生一些事情”(“6. 保存父关联”)。所以我想它解释了我所看到的。

【问题讨论】:

  • 要弄清楚到底发生了什么,请在回调中记录堆栈跟踪 (\Cake\Error\Debugger::trace()),这样您就可以真正弄清楚调用回调的原因/位置。另请注意,CakePHP 3 中没有 callbacks 选项。顺便说一句,您也可以使用 beforeSave 在主实体上创建关联数据,并让 Cake 一次保存所有内容。

标签: cakephp cakephp-3.0


【解决方案1】:

我能想到这个场景:

  • 当您执行 $testTable->save($test) 时,关联(测试)会根据铭文保存,因此在 $testTable->save($test) 行后面调用 $inscriptions->save($test) .在这种情况下,您可以尝试使用 ->update() 代替 saving data 中的 ->save(),因为更新不会触发 afterSave 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多