Php Symfony/doctor-根据现有数据库值查询日期值

Php Symfony/doctor-根据现有数据库值查询日期值,php,mysql,symfony,validation,doctrine-orm,Php,Mysql,Symfony,Validation,Doctrine Orm,我有两个实体payroll week和payroll period,我想写一个查询,检查用户在payroll period表中输入的开始日期和结束日期是否在已经填充的payroll week表中找到,并在数据库中用该payroll period id更新它。每个类看起来都像。这就是我到目前为止对这个问题所做的 工资期实体: 更改: public function createAction(Request $request) { $entity = new Payrollperiod();

我有两个实体payroll week和payroll period,我想写一个查询,检查用户在payroll period表中输入的开始日期和结束日期是否在已经填充的payroll week表中找到,并在数据库中用该payroll period id更新它。每个类看起来都像。这就是我到目前为止对这个问题所做的

工资期实体: 更改:

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(),
    );
}

首先,您需要获取PayrollPeriod id,然后相应地更新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
类成员更改为
$payrollperiod
,因为它引用的是相应的payrollperiod实体,而不是单个外键整数id。

这里是一个示例。如果您的工资发放周期已经存在,并且是每周工资发放所需的周期,那么您可以构建表单以返回要从中选择的工资发放周期,而不是在提交表单后查询它

在本例中,领土属于一个国家。因此,表单将显示一个国家列表

$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'
    ])

您必须稍微弄乱选项标签,以便根据需要格式化
\DateTime
的显示。

这是我在存储库中的公共函数payrollPeriodWeek(){return$This->EntityManager()->createquery('select startDate and endDate from AcmeDemoBundle:Payrollweek update payrollperiodid')->getresults();}请编辑您的原始问题以将其添加到其中,在注释中查看格式太困难。好的,我已编辑了原始问题,但您的原始代码中存在错误。您有
new\doctor\Common\Collection\ArrayCollection();
但是集合是复数的。它应该是
new\Doctrine\Common\Collections\ArrayCollection()
好的,谢谢。这个查询可行吗?好的,谢谢,但是在这里做任何事情来获取Payrollweek实体是什么意思。我可以在createAction函数中尝试一下。如果Payrollweek不存在,我不需要添加错误消息。这取决于您的初始声明,您想用e Payrollperiod id,因此我假设Payrollweek已经存在。如果不存在,您将创建一个新实体,其中
$Payrollweek=new Payrollweek;
该实体确实存在,但与它已经存在的方式类似。不确定我是否理解这将如何将工资周期id发送到数据库中的payroll week表中。可以请解释。这是一个好主意,但这是不可能的,因为用户在数据库中选择了两周的时间段,而在数据库中它是一周的时间段。或者我可以让开始日期为一周,结束日期为另一周,然后工资单周表需要用工资单周期ID进行更新。那么Jason的答案可能更简单表。您正在创建一个payrollWeek,因为您似乎正在使用此
$entity=new payrollPeriod();$form=$this->createCreateForm($entity)为payrollPeriod创建一个表单;
表单是针对工资周期的,输入的数据将进入数据库。但是在进入数据库之前,需要检查工资周表中是否存在该周期。我喜欢你的想法,但是如果两个用户输入相同的周期,那么工资周表将更新为当前工资周期。我正在尝试你的方法想法,但它似乎没有改变,是因为formtype是根据条令自动生成的吗?这是否可行?允许用户从下拉列表中选择开始和结束日期,如果该时间段>两周,那么如果用户输入的开始和结束日期已经存在,那么他们将另外得到一个错误嗯,他们也会出错。这太复杂了吗?
$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();
}
$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'
    ]);
$builder
    ->add('payrollperiodid', EntityType::class, [
        'class'         => 'AppBundle:Payrollperiod',
        'choice_label'  => 'startdate'
    ])