Symfony Doctrine2:我如何使用有限的一对多关系


Symfony Doctrine2: How do I work with limited one-to-many relation?

我有一个实体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 到 6)只能有一个(或没有)记录。

所以我认为我需要的是这样的方法,

public function setWorkHourByWeekday($hour_from, $hour_to, $weekday);
public function getWorkHourByWeekday($weekday);

在为员工设定工作时间后,当您坚持该员工时,我希望教义删除那些不再存在的工作时间,更新那些改变的工作时间,并创造以前不存在的新工作时间。

我该如何实现?我应该在类Employee或其Repository中编写这些逻辑,还是在WorkHourManager类中编写这些逻辑?

我认为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);
}

$workHours上设置orphanRemoval=true以删除没有EmployeeWorkHours

当提供无效的工作日(0-6 除外)时,Workday实体中的 setWeekday 方法应引发异常。您还可以将Weekday值对象与 Doctrine 可嵌入对象结合使用。

在这种情况下,我会去服务或经理类。

我的建议是不要放弃以前的工作时间,也许你现在不需要,但这些数据将来可能会有用。因此,最好只是将工作时间添加到员工并报告以获取今天的最后一个工作时间。关于验证,有很多方法可以做到这一点。如果您正在使用表单并且规则很复杂,则可能需要阅读 http://symfony.com/doc/current/cookbook/validation/custom_constraint.html,但也许您可以在操作控制器或实体类本身中找到替代方案。