CakePHP: множественные отношения модели hasOne - PullRequest
0 голосов
/ 18 октября 2011

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

Во всяком случае, вот мои модели и отношения между ними:

Users hasMany Jobs
Jobs belongTo Users
Users hasMany Availabilities
Availabilities belongTo Users
Jobs hasOne Periods
Periods belongTo Jobs
Availabilities hasOne Periods
Periods belongTo Availabilities

Проблема в том, что «Периоды» находятся на принимающей стороне двух отношений hasOne, и, если я не ошибаюсь, это то, что вы не можете сделать в CakePHP. Как лучше всего действовать в этой ситуации?

Возможно, вы также заметили тот факт, что «Работа» может быть назначена кому-то («Пользователь») или нет. Должен ли я отказаться от отношения и создать его после назначения задания или создать вымышленного пользователя, представляющего «никто» для неназначенных заданий?

Я бы опубликовал красивое изображение, но мне не хватает репутации, извините! Вот ссылка .

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

Похоже, что модель Period должна быть полиморфной .Проверьте ответ на этот вопрос и на эту статью в пекарне.

Я часто использовал эту технику, и она прекрасно работает для такого рода вещей.

0 голосов
/ 18 октября 2011

Проблема в том, что «Периоды» находятся на принимающей стороне двух отношений hasOne, и, если я не ошибаюсь, это то, что вы не можете сделать в CakePHP.Как лучше всего действовать в этой ситуации?

Я не вижу проблемы.Вы должны иметь возможность добавить внешний ключ для каждого отношения hasOne в таблицу periods (periods.job_id и periods.availability_id).

Возможно, вы также заметили тот факт, что "Job" можетбыть назначенным кому-то («Пользователь») или нет.Должен ли я отказаться от отношения и создать его после назначения задания или создать вымышленного пользователя, представляющего «никто» для неназначенных заданий?

Это нормально.Просто установите jobs.user_id, чтобы разрешить нулевые значения, и установите отношения.Это позволит создавать рабочие места без назначения пользователям.После выполнения поиска вы можете проверить empty($results['User']), чтобы определить, имеете ли вы дело с неназначенным заданием.

Пользователи имеют много рабочих мест, задания принадлежат пользователям, ...

Просто напоминание: названия моделей должны быть единичными (т. Е. У пользователя есть много заданий, задания принадлежат пользователю и т. Д.)Доступность и никогда одновременно.Есть ли обычный способ сделать это?

Вы можете написать валидацию для этого в модели Period:

$validate = array(
    'job_id' => array(
        array(
            'rule' => 'validBelongsTo',
            'message' => 'A period can either belong to a job or an availability'
        ),
    ),
);

public function validBelongsTo() {
    $hasJob          = !empty($this->data['Period']['job_id']);
    $hasAvailability = !empty($this->data['Period']['availability_id']);
    if ($hasJob && $hasAvailability) {
        return false;
    } else {
        return true;
    }
}
...