单独插入所有文本字段以及第一个文本字段值[多对一关系]

Hus*_*zal 15 php symfony

1.简介

我想知道是否有办法在数据库的新行中保存一组文本字段,每个文本字段中的第一个框的值也将随之保存.

2.解释

这是表格:

在此输入图像描述

当用户点击保存时,它应该保存在数据库中:

在此输入图像描述

我的表结构是

在此输入图像描述

3.我现在正在做什么?!

3.1 - 在我的addNew.php(来自类文件(我知道我不遵循命名约定,我的不好)在构造函数中,我从我的控制器(addNewAction())获得语言列表.

我遍历语言数组并生成语言翻译的文本字段.

3.2-当用户点击保存时,我遍历文本字段并检查语言键文本字段并将其值保存在变量中,并在每次循环翻译文本字段时使用该变量

我现在的代码


4.1 - addNewAction

public function addNewAction()
{
  // to add new key and translation associated with it
  // an array of optnions which cotains list of languages

  $options = $this->getAllLanguages();
  $form = $this->createForm(new AddNew($options));
  $form->bind($this->getRequest());

  if ($form->isValid()) {
      foreach($form->getData() as $key => $value){
        $oTranslation = new Translations();
        if($key == 'languageKey'){
          $languageKey = $value;
          continue;
        }

        $locale = $key;
        $translation = $value;
        $language = $this->getDoctrine()
                    ->getRepository('CodeizSDBTranslatorBundle:Languages');
        $query = $language->createQueryBuilder('l')
                           ->select('l.id')
                           ->where('l.locale = :locale')
                           ->setParameter('locale' , $locale)
                           ->getQuery();
        $id = $query->getResult();
        $oTranslation->setLanguageId($id[0]['id']);
                     $oTranslation->setLanguageKey($languageKey);
                     $oTranslation->setTranslation($translation);
                  $em = $this->getDoctrine()->getManager();
      $em->persist($oTranslation);
      $em->flush();
    }



      return $this->redirect($this->generateUrl('codeiz_sdb_translator_addlanguagekey'));
  }
   return $this->render('CodeizSDBTranslatorBundle:Default:addNewKey.html.twig', array(
        'form' => $form->createView(),
    ));
}
Run Code Online (Sandbox Code Playgroud)

4.2 - addNew.php(来自班级)

<?php
namespace Codeiz\SDBTranslatorBundle\Form\Add;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class AddNew extends AbstractType
{
    private $languages;
    public function __construct($languages){
        $this->languages = $languages;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->add('languageKey');
        foreach ($this->languages as $key => $value) {
                    $builder->add($value['locale'] , 'text' , array('label'=>$value['description']) );
        }


    }

    public function getName()
    {
        return 'addnew';
    }
}
Run Code Online (Sandbox Code Playgroud)

4.3 - 这是我传递给表单以生成文本字段的数组,存储在其中 $this->languages,看起来像

Array
(
    [0] => Array
        (
            [id] => 1
            [locale] => en_US
            [description] => English - United States
        )

    [1] => Array
        (
            [id] => 2
            [locale] => fr_FR
            [description] => Frenish
        )

)
Run Code Online (Sandbox Code Playgroud)

5.可能的解决方案

这些是我以为我可能会做的事情:

5.1-使用我的代码BLAH.

5.2-重组数据库,每个语言都是一列.

六,结论

我尝试了很多对我来说不起作用的东西,而我现在这样做的方式让它看起来不成熟.

除此之外,我还在学习,我真的想在没有重组数据库的情况下解决这个问题.

注意:

请避免讨论性能,将注意力集中在问题上...并且请更改标题,因为我确定这不是描述问题的正确方法..或者甚至更好地建议一个..如果你恶搞一些不正确的技术术语请编辑他们..谢谢:)

jam*_*s_t 1

在本例中您要寻找的是嵌入表单

这允许您创建一个包含多个翻译的翻译表单。

将您的语言键字段添加到父表单,然后您可以循环遍历 POST 数据中的子翻译。

这是一个更优雅和可扩展的解决方案,但如果它没有损坏,就不要修复它。