我在删除字段之前尝试执行某些逻辑。我有一些模型依赖于被删除的模型,我想确保与这些相关模型相关的图像文件也被删除,但我对模型回调如何工作有点困惑。
我知道我在模型类中定义了之前的Delete函数,但是如何访问当前模型中的数据或被删除的依赖模型?
function beforeDelete() {
}
我对如何使用这些回调感到有点困惑,而且我还没有看到任何好的文档。
修改 将此添加到父模型后,它似乎总是返回false。
function beforeDelete() {
if ($this->DependentModel->find('count', array('conditions' => array('DependentModel.parent_id' => $this->id))) == 1){
return true;
} else{
return false;
}
}
我应该明白我在这里要做什么。如果表中存在依赖模型的一个条目,则返回true并继续删除。我确保实际上有一个表条目依赖于被删除的对象。当我执行删除操作时,它总是返回false。这是怎么回事?
答案 0 :(得分:9)
使用回调时,您可以参考您要扩展的类的API来检查它接受的参数。您的实现应至少接受与您重写的方法相同的参数。
例如,Model::beforeDelete
的实现方式如下:
/**
* Called before every deletion operation.
*
* @param boolean $cascade If true records that depend on this record will also be deleted
* @return boolean True if the operation should continue, false if it should abort
* @link http://book.cakephp.org/2.0/en/models/callback-methods.html#beforedelete
*/
public function beforeDelete($cascade = true) {
return true;
}
此外,ModelBehavior::beforeDelete
也是这样实现的(即在进行行为时):
/**
* Before delete is called before any delete occurs on the attached model, but after the model's
* beforeDelete is called. Returning false from a beforeDelete will abort the delete.
*
* @param Model $model Model using this behavior
* @param boolean $cascade If true records that depend on this record will also be deleted
* @return mixed False if the operation should abort. Any other result will continue.
*/
public function beforeDelete(Model $model, $cascade = true) {
return true;
}
接下来,了解保存到模型并传入控制器数据(即控制器中的$this->data
)时数据为set to the model(即$this->data
非常有用。在模型中)。 [这发生在Model::save()
期间,目前正在line 1225上。]
对于第一个示例,您可以使用$this
访问模型,在第二个示例中,您可以使用$model
访问模型(因为$this
将是行为上下文)。因此,要获取数据,您需要使用$this->data
或$model->data
。您还可以使用链接访问该模型的相关模型(即$this->RelatedModel
或$model->RelatedModel
)。
当docblock注释状态时,$cascade
会告诉您这是否是正在发生的级联删除(默认情况下为true
),以防您的代码需要采取不同的操作时不是这样的;如果要中止保存操作,则该方法的实现应返回false(否则,在完成后返回true)。
CakePHP有Media plugin,它实现了this exact functionality,可用作参考。