我有两个模型:绘图有许多面板和面板属于绘图。每次保存面板时,我都想检查它是否是要添加到图形中的第三个面板。如果是,我想将三个面板合并为一个新的png文件,并将png的文件名和路径保存到Drawing表中。
class Drawing extends AppModel {
public $name = 'Drawing';
public $hasMany = array(
'Panel' => array(
'className' => 'Panel',
'dependent' => true,
'fields' => array('id', 'filepath', 'filename', 'placement')
)
);
}
class Panel extends AppModel {
public $name = 'Panel';
public $belongsTo = array(
'Drawing'=>array(
'className'=>'Drawing',
'foreignKey'=>'drawing_id',
'counterCache' => true
)
);
}
由于我在Panel模型中将counterCache设置为true,因此我在图纸表中使用panel_count跟踪面板 - 我可以检查何时有3个面板。我认为最好的方法是使用afterSave()回调。这样,我可以检查现在是否有三个面板,如果有,我可以更新我想要的任何内容。 (我的控制器会阻止用户在有三个时添加新面板)。但是,我不认为下面的代码有效 - 它会阻止我的应用程序的其他部分运行,如果我删除了afterSave()函数,一切都会再次运行。如何在Drawing模型中检查panel_count?有更好的方法吗?
// Inside of the Drawing model...
public function afterSave($created){
if ($this->data[panel_count] == 3){
// create a new image by merging the three panel images together
// add the filename and path of the new image to the database
}
}
答案 0 :(得分:0)
创建一个新的模型方法来执行该功能,并使用该方法从控制器中保存。原因是Drawing.panel_count属性的更改(您必须更新Drawing记录,这会创建一个afterSave循环)。
我通常会避免任何数据修改的回调(特别是在同一个模型中),因为它们每次都会运行,有时我只是想在没有额外修改的情况下保存。将一段代码从一个方法移动到一个afterSave回调比以后更容易。