CakePHP - удалить каскад не работает - PullRequest
3 голосов
/ 19 апреля 2011

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

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

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

У меня это как

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

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

Спасибо,
Тройник

Ответы [ 3 ]

8 голосов
/ 21 апреля 2011

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

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

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

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

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

8 голосов
/ 19 апреля 2011

Я не думаю, что вы можете удалить 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-s.

2 голосов
/ 08 ноября 2012

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

Я установил отношение TypeTo для модели 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...