Предположим, что 4 типа моделей содержат информацию, которую нельзя объединить в один тип. То есть они не имеют общности, за исключением того, что все они имеют идентификатор цели и являются взаимоисключающими. Давайте предположим, что экземпляр любой из этих моделей может принадлежать только одной цели.
Вы можете настроить модель цели, используя отношение ownTo и предложение условий, чтобы она пыталась загрузить дочерний элемент каждого типа.
class Goal extends AppModel {
/* ... */
var $belongsTo = array(
'CampaignRoi' => array(
'className' => 'CampaignRoi',
'conditions' => array('Goal.model' => 'CampaignRoi'),
'foreignKey' => 'model_id'
),
'CallSuccess' => array(
'className' => 'CallSuccess',
'conditions' => array('Goal.model' => 'CallSuccess'),
'foreignKey' => 'model_id'
),
'PhoneSkill' => array(
'className' => 'PhoneSkill',
'conditions' => array('Goal.model' => 'PhoneSkill'),
'foreignKey' => 'model_id'
),
'CallQuality' => array(
'className' => 'CallQuality',
'conditions' => array('Goal.model' => 'CallQuality'),
'foreignKey' => 'model_id'
)
);
/* ... */
}
В вашей таблице целей у вас будет поле model и поле model_id. Поле модели будет заполнено CampaignRoi, CallSuccess, PhoneSkill или CallQuality. После того, как вы нашли свою цель в Goal, вам все равно нужно проверить цель.model, чтобы определить, с каким типом ребенка вам нужно работать.
Это метод, который я использовал несколько раз, хотя я не могу вспомнить, что происходит с другими моделями. В худшем случае это пустой массив или поле (то есть пустое ($ goal ['CampaignRoi']) == true, если $ goal ['Goal'] ['model'] == 'CallSuccess').
Подтипирование в реляционных базах данных никогда не доставляет удовольствия.