php - 如何从symfony3中的同一表单访问2个表?

标签 php mysql symfony drop-down-menu doctrine

我有一个 Controller 。我在该 Controller 中有一个表单。我希望从表(状态表)中以下拉形式接收表单中的数据,并在单击创建时将从该状态表接收到的数据发送到另一个表(站点表)。两个表都在同一个数据库中。那么我该如何在 symfony 中做到这一点呢?

Controller

public function createAction(Request $request)
    {

        $site = new site;

        $form = $this->createFormBuilder($site)




    ->add('site_id', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('site_type', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('company', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('main_company', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('site_name', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('unit_no', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('street_no', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('street', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('suburb', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('state', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('post_code', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('contact_no', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('fax', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('access_notes', TextareaType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('e_mail', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('web', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('contact_person_1', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('contract_starting_date', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('contract_end_date', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('contract_special_note', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('site_specification', TextareaType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('other_comments', TextareaType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('added_by', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))

    ->add('hours_per_month', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('cleaners_per_session', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('auto_sign_out', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('time_zone', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('location_path', TextareaType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('lat', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('lng', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('service_price', NumberType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('earliest_start', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('access_duration', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('time_span', TextType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('cost_rates_json', TextareaType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))
    ->add('site_status', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px')))









    // ->add('date_time', DateTimeType::class, ['attr' => ['style' => 'margin-bottom: 15px;display: flex']])
    ->add('save', SubmitType::class, array('label' => "Create",'attr' => array('class' => 'btn btn-success', 'style' => 'margin-bottom:15px')))
    ->getForm();









        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid())





        {




//Get Data

            $site_id = $form['site_id']->getData();
            $site_type = $form['site_type']->getData();
            $category = $form['category']->getData();
            $company = $form['company']->getData();
            $main_company = $form['main_company']->getData();
            $site_name = $form['site_name']->getData();
            $unit_no = $form['unit_no']->getData();
            $street_no = $form['street_no']->getData();
            $street = $form['street']->getData();
            $suburb = $form['suburb']->getData();
            $state = $form['state']->getData();
            $post_code = $form['post_code']->getData();
            $contact_no = $form['contact_no']->getData();
            $fax = $form['fax']->getData();
            $access_notes = $form['access_notes']->getData();
            $e_mail = $form['e_mail']->getData();
            $web = $form['web']->getData();
            $contact_person_1 = $form['contact_person_1']->getData();
            $contract_starting_date = $form['contract_starting_date']->getData();
            $contract_end_date = $form['contract_end_date']->getData();
            $contract_special_note = $form['contract_special_note']->getData();
            $site_specification = $form['site_specification']->getData();
            $other_comments = $form['other_comments']->getData();
            $added_by = $form['added_by']->getData();
            $hours_per_month = $form['hours_per_month']->getData();
            $cleaners_per_session = $form['cleaners_per_session']->getData();
            $auto_sign_out = $form['auto_sign_out']->getData();
            $time_zone = $form['time_zone']->getData();
            $location_path = $form['location_path']->getData();
            $lat = $form['lat']->getData();
            $lng = $form['lng']->getData();
            $service_price = $form['service_price']->getData();
            $earliest_start = $form['earliest_start']->getData();
            $access_duration = $form['access_duration']->getData();
            $time_span = $form['time_span']->getData();
            $cost_rates_json = $form['cost_rates_json']->getData();
            $site_status = $form['site_status']->getData();
            $now = new\DateTime('now');






            $site->setSiteId($site_id);
            $site->setSiteType($site_type);
            $site->setCompany($company);
            $site->setMainCompany($main_company);
            $site->setSiteName($site_name);
            $site->setUnitNo($unit_no);
            $site->setStreetNo($street_no);
            $site->setStreet($street);
            $site->setSuburb($suburb);
            $site->setCategory($category);
            $site->setState($state);
            $site->setPostCode($post_code);
            $site->setContactNo($contact_no);
            $site->setFax($fax);
            $site->setAccessNotes($access_notes);
            $site->setEMail($e_mail);
            $site->setWeb($web);
            $site->setContactPerson1($contact_person_1);
            $site->setContractStartingDate($contract_starting_date);
            $site->setContractEndDate($contract_end_date);
            $site->setContractSpecialNote($contract_special_note);
            $site->setSiteSpecification($site_specification);
            $site->setOtherComments($other_comments);
            $site->setAddedBy($added_by);
            $site->setHoursPerMonth($hours_per_month);
            $site->setCleanersPerSession($cleaners_per_session);
            $site->setAutoSignOut($auto_sign_out);
            $site->setTimeZone($time_zone);
            $site->setLocationPath($location_path);
            $site->setLat($lat);
            $site->setLng($lng);
            $site->setServicePrice($service_price);
            $site->setEarliestStart($earliest_start);
            $site->setAccessDuration($access_duration);
            $site->setTimeSpan($time_span);
            $site->setCostRatesJson($cost_rates_json);
            $site->setSiteStatus($site_status);
            $site->setDateTime($now);



            $em = $this->getDoctrine()->getManager();
            $em->persist($site);
            $em->flush();









            $this->addFlash(
                    'notice',
                    'Entry Created'
                );











//return new RedirectResponse('http://localhost:8000/loc/');




 return $this->redirectToRoute('site_list');


        }






         return $this->render('sites/create.html.twig', array(
                'form' => $form->createView(),
                'site' =>  $site
            ));
    }

我想要来自 this table 的下拉菜单转到类别字段中的 site_table like this (我对站点表进行了硬编码)

最佳答案

您应该首先创建一个 FormType,然后使用 EntityType 作为下拉列表,如下所示:



class MyFormType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('type', EntityType::class, [
                'label' => 'State',
                'class' => YourStateEntity::class
            ]);

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => YourSiteEntity::class
        ]);
    }
}

查看“YourStateEntity”和“YourSiteEntity”,并替换为与您的“州”表和“站点”表相对应的您自己的实体。

然后在你的 Controller 中:

    public function createAction(Request $request, EntityManagerInterface $entityManager)
    {
        $site = new YourSiteEntity();

        $form = $this->createForm(MyFormType::class, $site);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager->persist($site);
            $entityManager->flush();

            return $this->redirectToRoute('site_list');

        }

        return $this->render('sites/create.html.twig', [
            'form' => $form->createView(),
            'site' =>  $site
        ]);
    }

这是推荐的方式。将所有字段放入“MyFormType”中,然后让 Symfony 完成它的工作。

请看这里:https://symfony.com/doc/current/forms.html#creating-form-classes

关于php - 如何从symfony3中的同一表单访问2个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46974381/

相关文章:

php - 使用 Symfony 3 在同一页面上呈现多个表单

php - mysql DELETE 适用于 phpmyadmin 但不适用于 php 脚本

javascript - 如何在单击新页面上的按钮时显示数据库中的信息?

mysql - 使用附加维度表作为始终存在的维度

mysql - 需要左连接吗? WHERE 条件的行为类似于 INNER JOIN

Twig 提取 FOR 循环变量

php - 通过自定义包的 Symfony 路由仅适用于控制台模式

php - 如何正则表达式匹配具有不同结尾的文本?

mysql同一列上的多个案例

symfony - 从 Controller 和/或 Twig 模板访问服务