Symfony / Doctrine – значения дат запроса в отношении существующих значений базы данных

У меня есть две недели заработной платы и период оплаты, я хочу написать запрос, который проверяет, была ли указана дата начала и конечная дата, введенная пользователем в таблицу периода расчета заработной платы, в таблице недели заработной платы, которая уже заполнена, и обновить ее с помощью этой заработной платы id периода в базе данных. Каждые классы выглядят. Это то, что я сделал до сих пор в отношении запроса.

Payrollperiod Entity:

<?php namespace com\twcl\agripayrollBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * Payrollperiod * * @ORM\Table(name="PayrollPeriod") * @ORM\Entity */ class Payrollperiod { /** * @var integer * * @ORM\Column(name="payrollperiodid", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $payrollperiodid; /** * @var \DateTime * * @ORM\Column(name="startDate", type="datetime", nullable=false) */ private $startdate; /** * @var \DateTime * * @ORM\Column(name="endDate", type="datetime", nullable=false) */ private $enddate; /** * @var integer * * @ORM\Column(name="State", type="integer", nullable=false) */ private $state; public function getPayrollperiodid() { return $this->payrollperiodid; } public function getStartdate() { return $this->startdate; } public function getEnddate() { return $this->enddate; } public function getState() { return $this->state; } public function setPayrollperiodid($payrollperiodid) { $this->payrollperiodid = $payrollperiodid; } public function setStartdate(\DateTime $startdate) { $this->startdate = $startdate; } public function setEnddate(\DateTime $enddate) { $this->enddate = $enddate; } public function setState($state) { $this->state = $state; } /** * Render a payrollPeriodID as a string. * * @return string */ public function __toString() { return (string) $this->getPayrollperiodid(); } } 

Payrollweek Entity:

 <?php namespace com\twcl\agripayrollBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** * Payrollweek * * @ORM\Table(name="PayrollWeek", indexes={@ORM\Index(name="IDX_1B4F90669AD94696", columns={"payrollperiodid"})}) * @ORM\Entity */ class Payrollweek { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var \DateTime * * @ORM\Column(name="startDate", type="datetime", nullable=false) * @Assert\Type("DateTime") */ private $startdate; /** * @var \DateTime * * @ORM\Column(name="endDate", type="datetime", nullable=false) * @Assert\Type("DateTime") * @Assert\Expression("this.getStartDate() < this.getEndDate()", * message="The end date must be after the start date") */ private $enddate; /** * @var integer * * @ORM\Column(name="normalHours", type="integer", nullable=true) */ private $normalhours; /** * @var integer * * @ORM\Column(name="numOfDays", type="integer", nullable=true) */ private $numofdays; /** * @var \Payrollperiod * * @ORM\ManyToOne(targetEntity="Payrollperiod") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="payrollperiodid", referencedColumnName="id", nullable=false) * }) */ private $payrollperiodid; public function getId() { return $this->id; } public function getStartdate() { return $this->startdate; } public function getEnddate() { return $this->enddate; } public function getNormalhours() { return $this->normalhours; } public function getNumofdays() { return $this->numofdays; } public function getPayrollperiodid() { return $this->payrollperiodid; } public function setId($id) { $this->id = $id; } public function setStartdate(\DateTime $startdate) { $this->startdate = $startdate; } public function setEnddate(\DateTime $enddate) { $this->enddate = $enddate; } public function setNormalhours($normalhours) { $this->normalhours = $normalhours; } public function setNumofdays($numofdays) { $this->numofdays = $numofdays; } public function setPayrollperiodid($payrollperiodid) { $this->payrollperiodid = $payrollperiodid; } /** * Render StartDate and EndDate as a string. * * * @return string */ public function __toString() { return (string) $this->getStartdate()->format('dM-y').'/'.$this->getEnddate()->format('dM-y'); } public function __construct() { $this->PayrollweekType = new \Doctrine\Common\Collection\ArrayCollection(); } } 

Payrollweek Entity Repository:

 namespace com\twcl\agripayrollBundle\Entity; use Doctrine\ORM\EntityRepository; /** * PayrollweekRepository * * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class PayrollweekRepository extends EntityRepository { public function payrollPeriodWeek(){ return $this->EntityManager()->createquery( 'select startDate and endDate from AcmeDemoBundle:Payrollweek update payrollperiodid' )->getresults() ; } } 

ИЗМЕНЕНИЯ:

 public function createAction(Request $request) { $entity = new Payrollperiod(); $form = $this->createCreateForm($entity); $form->handleRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $payrollweek=new Payrollweek(); $payrollperiod=$em->getRepository('comtwclagripayrollBundle:PayrollPeriod') ->findOneBy(['startDate' => $startDate, 'endDate' => $endDate]); if ($payrollperiod) { $payrollweek->setPayrollperiod($payrollperiod); } else{ $this->addFlash('error','ERROR! Not a valid payroll week'); return $this->redirect($this->generateUrl('payrollperiod')); } $em->persist($payrollweek); $em->flush(); //return $this->redirect($this->generateUrl('payrollperiod_show', array('payrollperiodid' => $entity->getpayrollperiodid()))); } return array( 'entity' => $entity, 'form' => $form->createView(), ); } 

Related of "Symfony / Doctrine – значения дат запроса в отношении существующих значений базы данных"

Сначала вы захотите получить идентификатор PayrollPeriod, а затем обновите свой объект Payrollweek соответствующим образом. Вам даже не нужны какие-либо специальные функции репозитория. Если бы вы были в контроллере, это выглядело бы так:

 $em = $this->getDoctrine()->getManager(); $payrollweek = // do whatever here to get a Payrollweek entity $payrollperiod = $em->getRepository('agripayroll:\PayrollPeriod) ->findOneBy(['startDate' => $startDate, 'endDate' => $endDate]); if ($payrollperiod) { $payrollweek->setPayrollperiod($payrollperiod); $em->persist($payrollweek); $em->flush(); } 

Вам даже не нужно использовать какие-либо пользовательские функции репозитория, хотя это не помешает помещать их туда. Я также изменил $payrollperiodid член класса $payrollperiodid на $payrollperiod поскольку он ссылается на соответствующий объект Payrollperiod, а не на отдельный идентификатор целочисленного ключа.

Вот пример. Если ваш период заработной платы уже существует, который необходим для PayrollWeek, вы можете создать свою форму, чтобы возвращать PayrollPeriods для выбора вместо запроса для нее после отправки формы.

В этом примере территория принадлежит к стране. Таким образом, форма отобразит список стран.

 $builder ->add('name', TextType::class, [ 'label' => 'Territory Name', ]) ->add('abbrev', TextType::class, [ 'label' => 'Territory Abbreviation', ]) ->add('belongingCountry', EntityType::class, [ 'class' => 'AppBundle:Address\Country', 'choice_label' => 'name', 'label' => 'Country' ]); 

В вашем случае, если PayrollWeek принадлежит PayrollPeriod. Вы можете сделать то же самое.

 $builder ->add('payrollperiodid', EntityType::class, [ 'class' => 'AppBundle:Payrollperiod', 'choice_label' => 'startdate' ]) 

Вам нужно будет немного поменять флажок choice_label для форматирования отображения \DateTime по своему усмотрению.