CakePHP несколько HABTM отношений - PullRequest
0 голосов
/ 10 марта 2011

У меня есть таблица активов, которая содержит все поля, общие для всех типов активов, например, name, path, filetype, size и т. Д.

Теперь у меня есть 2 типа активов: активы, принадлежащие architects и активы, принадлежащие construtors. Поэтому я установил отношения HABTM для этих двух типов, то есть

      |-------- architects_assets ------- architects
assets|
      |-------- constructors_assets ----- constructors

Проблема в том, что при создании актива я хочу, чтобы каждый актив был одним из или architects_asset или constructors_asset - активы никогда не являются одновременно архитекторами и конструктор актив.

Простым решением будет создание architect_assets и constructors_assets таблиц и удаление таблицы assets, так как таким образом вы можете добавлять, редактировать, просматривать, удалять каждый тип отдельно. Кроме того, я думаю, что мог бы создать действия architects_asset_add и constructors_asset_add в контроллере assets, но тогда мне пришлось бы сделать то же самое для редактирования, просмотра и удаления, которое кажется раздутым.

Как бы вы подошли к этой проблеме?

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Я смог решить эту проблему, используя отношения hasMany - . Это означало создание отдельных контроллеров для architects_assets и construtors_assets, но это мне подходит, учитывая, что мне нужно было провести четкое различие между двумя типами активов.

Полученные модели:

//asset
class Asset extends AppModel {
  public $hasMany = array('ArchitectAsset', 'ConstructorAsset')
}

//architect asset
class ArchitectAsset extends AppModel {
  public $belongsTo = array('Architect, Asset');
}

//architect
class Architect extends AppModel {
  public $hasMany = 'ArchitectAsset';
}

//and the same for the ConstructorAsset and Constructor models
0 голосов
/ 10 марта 2011

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

...