如果是自引用的tolies关联中的孩子,则防止删除

时间:2019-10-01 17:05:20

标签: cakephp cakephp-3.0

在我的ModelsTable中,我有两个虚拟字段,用于使用AccessoriesTable进行模型和另一个模型(子代是父代的附件,并且可以有多个子代)之间的自引用ongsToMany关联。 (具有model_idaccessory_id列)来进行链接。

$this->belongsToMany('AccessoryModels', [
    'className' => 'Models',
    'through' => 'Accessories',
    'foreignKey' => 'model_id',
    'targetForeignKey' => 'accessory_id'
]);
$this->belongsToMany('ParentAccessoryModels', [
    'className' => 'Models',
    'through' => 'Accessories',
    'foreignKey' => 'accessory_id',
    'targetForeignKey' => 'model_id'
]);

删除模型时,我想确保它不会被用作其他模型的附件(孩子)。因此,我尝试在ModelsTable中创建一个自定义规则,但这将不起作用(即使它不是其他模型的附件,也不会删除任何模型)。

$rules->addDelete(function ($entity, $options) use($rules) {
    $rule = $rules->existsIn(['accessory_id'], 'ParentAccessoryModels');
    return !$rule($entity, $options);
}, 'isNotAnAccessory');

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我通过使用beforeDelete事件解决了这个问题:

public function beforeDelete($event, $entity, $options)
{
    $parentsModels = $this->get($entity->id, ['contain' => 'ParentAccessoryModels']);
    if (!empty($parentsModels->parent_accessory_models)) {
        return false;
    };
}