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

时间:2016-01-20 08:46:10

标签: php symfony doctrine-orm

我有一个实体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或其RepositoryWorkHourManager课程中编写这些逻辑吗?

2 个答案:

答案 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,但也许您可以在动作控制器或实体类本身中找到替代方案。