我正在尝试创建一个应用程序,该应用程序应根据其可用性以不规则的时间表向员工或志愿者分发工作。
无论如何,这是我的模型和他们之间的关系:
Users hasMany Jobs
Jobs belongTo Users
Users hasMany Availabilities
Availabilities belongTo Users
Jobs hasOne Periods
Periods belongTo Jobs
Availabilities hasOne Periods
Periods belongTo Availabilities
问题是“Periods”在两个hasOne关系的接收端,如果我没错,那么你在CakePHP中无法做到。在这种情况下,最好的方法是什么?
您可能还发现了“作业”可能被分配给某人(“用户”)的事实。我应该删除关系并在分配作业后创建它,还是应该为未分配的作业创建一个代表“nobody”的虚构用户?
我会发布一张漂亮的图片,但我没有足够的声誉,对不起! 这是一个link。
答案 0 :(得分:0)
问题是“Periods”在两个hasOne关系的接收端,如果我没错,那么你在CakePHP中无法做到。在这种情况下,最好的方法是什么?
我没有看到问题。您应该能够将每个hasOne关系的外键添加到periods
表(periods.job_id
和periods.availability_id
)。
您可能还发现了“作业”可能被分配给某人(“用户”)的事实。我应该删除关系并在分配作业后创建它,还是应该为未分配的作业创建一个代表“nobody”的虚构用户?
这很好。只需将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;
}
}
答案 1 :(得分:0)
听起来像Period
模型应该多态。查看面包店中this question和this article的答案。
我经常使用这种技术,它可以很好地处理这种事情。