Дизайн модели CakePHP - лучший способ? - PullRequest
0 голосов
/ 19 июля 2011

У меня есть модель "Цель", которая имеет четыре типа дочерних элементов (у всех из которых есть разные поля):

campaign_roi call_success phone_skill call_qluality

Таблица целей содержит поле "модель", котороеуказывает одну из четырех моделей выше.

Но у одной "цели" есть только один из 4 детей.У них никогда не будет двух типов детей.Есть ли лучший способ, чем создать модель для каждого ребенка?И если нет, то как я могу динамически указать, какой дочерний тип является любой целью?

Например, я хочу увидеть цель и ее ребенка - в данном случае campaign_roi.Как я могу настроить его там, где я могу это сделать

$this->Goal->find('first', array(
   'conditions' => array(
      'Goal.id' => $id
   )
)

И он возвращает информацию из модели цели и ее дочернего campaign_roi?

Ответы [ 3 ]

0 голосов
/ 19 июля 2011

Предположим, что 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').

Подтипирование в реляционных базах данных никогда не доставляет удовольствия.

0 голосов
/ 19 июля 2011

Разве вы не можете работать по-другому? Не с точки зрения цели, а с других?

Не указывайте никакого отношения в модели целей, укажите отношение hasOne в CampaignRoi, CallSuccess, PhoneSkill и CallQuality.

Делайте ваши запросы через CampaignRoi, CallSuccess, PhoneSkill и CallQuality.

0 голосов
/ 19 июля 2011

Для наследования модели мы можем создать sub_table с main_table_id для указания на main_table.Но это довольно запутанно, когда вам нужно получить полную запись.

Если эти четыре поля являются единственным отличием между детьми, вы можете поместить их все в таблицу целей.И если они имеют одинаковый тип данных, вы можете использовать только одно поле.Вы можете написать пользовательские методы поиска в модели (findModel1 (), ...) или определить массив ('model1name' => 'campaign_roi', ...) для последующего использования, когда вы найдете find ().

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

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