2013-05-13 3 views
0

Моя структура данных выглядит следующим образом:CakePHP Database Design

Company hasMany Regions 
Region hasMany Markets 
Market hasMany Stores 
Store hasMany Employees 

У меня также есть соответствующий belongsTo, где это необходимо.

Я использовал внешние ключи для ассоциаций. Например, каждый магазин имеет market_id.

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

Что является наиболее подходящим способом достижения этого?

  1. Могу ли я добавить дополнительные внешние ключи к столам? Например, нужны ли региону region_id и company_id в дополнение к market_id?

ответ

1

Использование зависимой ассоциации:

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany

dependent: When dependent is set to true, recursive model deletion is possible. In this example, Comment records will be deleted when their associated User record has been deleted.

Вам не нужно добавлять дополнительные внешние ключи.

+0

Привет, спасибо за ответ. Это работает на одном уровне. Я добавил, что зависит от модели CompanyMany Regions. Это привело к ожидаемому результату, связанные регионы были удалены. Однако рынки, магазины и сотрудники не были удалены. (Я добавил зависимые от всех моделей). Затем я попытался добавить компанию hasMany Markets в модель компании. Это приводит к следующей ошибке: «Неустранимая ошибка: объявления класса не могут быть вложенными ...» Мне нужно, чтобы рекурсивное удаление было распространено по многим таблицам, от Компании до Региона до Рынка, чтобы Хранить Работодателю на основании удаления Компании. – Jose

+0

Хорошо, я понял! Для вызова delete в CompaniesController.php необходимо, чтобы каскад был установлен в true. Это выглядит как $ this-> Company-> delete ($ id, true). Кроме того, для запуска на других уровнях, если я начну удаление на Market, я добавлю каскад в true, чтобы также связать Stores and Employees с удалением. – Jose