Предотвратить удаление, если дочерний элемент в ассоциации с самообращением принадлежит ToMany - PullRequest
0 голосов
/ 01 октября 2019

В моем ModelsTable у меня есть два виртуальных поля для самостоятельной ссылки на принадлежность toTany между моделью и другой (дочерний является родителем и может иметь несколько дочерних элементов) с использованием AccessoriesTablemodel_id и accessory_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 голосов
/ 09 октября 2019

Я понял это с помощью события beforeDelete:

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