[英]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
以刪除沒有Employee
WorkHours
。
當提供了無效的工作日(0-6除外)時, Workday
實體中的setWeekday
方法應引發異常。 您還可以結合使用Weekday
值對象和Doctrine可嵌入對象。
在這種情況下,我會去參加服務或經理班。
我的建議是不要減少舊的工作時間,也許您現在不需要了,但是這些數據將來可能會有用。 因此,最好將工作時間添加到員工並進行報告以獲取今天的最后工作時間會更好。 關於驗證,有很多方法可以做到這一點。 如果您使用表單並且規則復雜,則可能需要閱讀http://symfony.com/doc/current/cookbook/validation/custom_constraint.html ,但是也許您可以在動作控制器或實體類本身中找到替代方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.