#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;
}
Я надеюсь, что это поможет кому-то, у кого такая же проблема, как у вас, поскольку я уверен, что вы все еще не ждете ответа.