我有一个实体Employee
class Employee
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="WorkHour", mappedBy="employee", cascade={"persist", "remove"})
*/
private $workHours;
}
和WorkHour
class WorkHour
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Profile
*
* @ORM\ManyToOne(targetEntity="Employee", inversedBy="workHours")
* @ORM\JoinColumn(name="employee_id", referencedColumnName="id")
*/
protected $profile;
/**
* @var integer
*
* @ORM\Column(name="weekday", type="smallint")
*/
private $weekday;
/**
* @var \DateTime
*
* @ORM\Column(name="hour_from", type="time")
*/
private $hourFrom;
/**
* @var \DateTime
*
* @ORM\Column(name="hour_to", type="time")
*/
private $hourTo;
}
现在,当我要添加addWorkHour()
,removeWorkHour()
方法时,我感到很困惑。
通常一对多关系可以添加任意数量的关系,但在我的情况下,一个员工最多只能有7个工作时间,而且对于指定的weekday
(从0到0) 6)只能有一个(或没有)记录。
所以我认为我需要的是像
这样的方法public function setWorkHourByWeekday($hour_from, $hour_to, $weekday);
public function getWorkHourByWeekday($weekday);
在为员工设定工作时间后,当您坚持该员工时, 我希望教条删除那些不再存在的工作时间,更新那些改变的工作时间,并创建以前不存在的新工作时间。
我该如何实现?我应该在课程Employee
或其Repository
或WorkHourManager
课程中编写这些逻辑吗?
答案 0 :(得分:1)
我认为WorkDay
可能是您实体的更好名称,因此我将使用它:)。
$workdays= $employee->getWorkDays();
$workdays->clear(); // Clear existing workdays
// Add new workdays
foreach(...) {
$workday = new WorkDay();
$workday ->setWeekday(0); // You could use a constant like `WorkDay::MONDAY`
$workday ->setStart('09:00');
$workday ->setEnd('17:00');
$workdays->add($workday);
}
在orphanRemoval=true
上设置$workHours
,以便在没有WorkHours
的情况下移除Employee
。
setWeekday
实体中的Workday
方法应在提供无效工作日(0-6除外)时抛出异常。您还可以将Weekday
值对象与Doctrine embeddables结合使用。
在这种情况下,我会去服务或经理班。
答案 1 :(得分:0)
我的建议不是放弃旧的工作时间,也许你现在不需要,但这些数据将来可能会有用。因此,最好将workHours添加到Employee并制作报告以获取今天的最后一个工作时间。关于验证,有很多方法可以做到这一点。如果您正在使用表单并且规则很复杂,您可能需要阅读http://symfony.com/doc/current/cookbook/validation/custom_constraint.html,但也许您可以在动作控制器或实体类本身中找到替代方案。