【发布时间】: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