Удалить принадлежащий Ассоциации - PullRequest
1 голос
/ 22 июля 2011

Удивительно мало информации можно найти по этому поводу, и я думаю, что никогда не сталкивался с этим раньше, но я нахожусь в ситуации, когда у меня есть модель с отношением belongsTo. Модель - это ключ, и когда я удаляю запись, мне нужно убедиться, что связанная с ней запись также удалена.

В частности, у меня есть модель Building, которая belongsTo и Address. Когда я удаляю здание, я должен быть уверен, что связанный адрес также удален.

Конечно, я не могу пометить ассоциацию как зависимую, поэтому является ли обратный вызов лучшим способом убедиться, что запись адреса удалена, или есть лучший способ? Это один из тех случаев, когда я знаю, что могу сделать это с помощью обратного вызова, но на внутреннем уровне кажется, что должен быть лучший путь. Мне интересно, так ли это.

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 ноября 2016

В cakephp 3.x вы можете использовать метод unlink, как описано здесь:

http://api.cakephp.org/3.3/class-Cake.ORM.Association.HasMany.html#_unlink

Это установит поле внешнего ключа в базе данных на нуль

В вашем случае должно быть что-то подобное каждый раз, когда вы хотите удалять записи из зданий, поэтому интегрируйте их в функцию удаления. Конечно, это требует правильных ассоциаций в моделях.

$address = $this->Addresses->get('address_id'):
$building = $this->Buildings->find()->where(['building_id' => 'some_id'])->toArray();

if ($this->Addresses->association('Buildings')->unlink($address, $building)) { 
    $this->Flash->success(__('Success!'));
    return $this->redirect($this->referer());
} else {
    $this->Flash->error(__('Error.'));
    return $this->redirect($this->referer());
}
1 голос
/ 22 июля 2011

почему бы не использовать Foreign Keys в базе данных и выбрать on DELETE CASCADE, и пусть база данных сделает всю работу ...

[На основании комментария] если ваш адрес прикреплендля других моделей, которые вы не хотите удалять, вы можете установить эти FK на ON DELETE RESTRICT, и здание не будет удалено.

И если вам нужно что-то более сложное, вы можете добавить обратный вызов beforeDelete () в вашей моделиесть пример в документе

Удачи

...