CakePHP — каскад удаления не работает

#cakephp

#cakephp

Вопрос:

В CakePHP у меня есть тип модели и SpecificType.

Определенный тип принадлежит типу. (поле type_id)

Когда я удаляю запись SpecificType, как я могу также удалить Type?

У меня это как

 $this->SpecificType->del($id, true)
  

Однако запись в разделе Тип не удаляется.

Спасибо,
Tee

Комментарии:

1. Почему вы удаляете базовый тип при удалении определенного типа? Каскад удаления должен выполняться только для того, что многим не принадлежит

Ответ №1:

Я не думаю, что вы можете удалить Type с помощью SpecificType cascade. каскад можно использовать только при наличии отношения hasMany или HABTM.

так сказано в руководстве.

Удаляет запись, идентифицированную с помощью $id. По умолчанию также удаляет записи, зависящие от записи, указанной для удаления.

Например, при удалении записи пользователя, которая привязана ко многим записям рецептов (пользовательские рецепты ‘hasMany’ или ‘hasAndBelongsToMany’):

 * if $cascade is set to true, the related Recipe records are also
  

удален, если модели зависят от значения
установлено значение true.
* если для параметра $cascade установлено значение false, записи рецепта останутся после завершения
Пользователь был удален.

вы всегда можете запустить

 $this->del($id, true);
  

чтобы удалить ваш тип с соответствующими SpecificType-ами.

Ответ №2:

Вы хотите удалить тип, а не SpecificType. Вам также нужно будет убедиться, что ваша модель правильно настроена для типа:

 var $hasMany = array(
    'SpecificType' => array(
    'className' => 'SpecificType',
    'foreignKey' => 'type_id',
    'dependent'=> true,
    )
);
  

Затем удалите тип, и он заработает.

Если вы удаляете дочерний файл ( SpecificType ) и хотите удалить его родительский, вы должны вызвать delete в родительской модели. Но имейте в виду, если у вас правильно настроен каскад ( dependent = true на модели), все SpecificType дочерние элементы будут удалены в любом случае.

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

Комментарии:

1. 1 для зависимого индекса. Я посмотрел прямо на это в документах.

Ответ №3:

У меня была такая же проблема в ситуации, когда я не хотел следовать соглашению о ключах модели Cake.

Я установил для отношения belongsTo модели SpecificType значение Type следующим образом:

 public $belongsTo = array(
  'Type' => array(
    'className' => 'Type',
    'foreignKey' => 'type_id',
    'conditions' => '',
    'fields' => '',
    'order' => '',
  ),
);
  

Затем, чтобы заставить каскадное удаление работать, я добавил следующее к модели SpecificType:

 public function beforeDelete($cascade) {
  // Make sure the parent method runs.
  $continue = parent::beforeDelete($cascade);

  if ($continue) {
    // Delete the Type if there is one.
    $typeId = $this->field('type_id');
    if (!empty($typeId)) {
      $continue = $this->Type->delete($typeId);
    }
  }

  return $continue;
}
  

Я надеюсь, что это поможет кому-то, у кого такая же проблема, как у вас, поскольку я уверен, что вы все еще не ждете ответа.