2016-01-20 83 views
1

我有一個實體EmployeeSymfony Doctrine2:我如何使用有限的一對多關係?

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); 

而對於僱員集workhours後,當你堅持該員工, 我想學說刪除不再存在的那些workhours,更新那些改變的工作時間,並創造以前不存在的新工作時間。

我該如何執行此操作?我是否應該在類EmployeeRepositoryWorkHourManager類中編寫這些邏輯?

回答

0

我的建議是不要放棄老工作時間,也許你現在不需要,但這些數據可能在未來有用。所以,最好只是給員工添加工作時間,並做出報告,獲取今天的最後工作時間。關於驗證,有很多方法可以做到這一點。如果您使用表單並且規則很複雜,也許您需要閱讀http://symfony.com/doc/current/cookbook/validation/custom_constraint.html,但也許您可以在操作控制器或實體類本身中找到替代方案。

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

如果您的Workday實體中的setWeekday方法在提供了無效的工作日(非0-6)時應該會引發異常。您也可以將一個Weekday值對象與可嵌入的Doctrine結合使用。

在這種情況下,我會選擇服務或經理類。