php - 将所有文本字段与第一个文本字段值一起单独插入 [多对一关系]

标签 php symfony

1。简介

我想知道是否有一种方法可以将一组文本字段保存在数据库中的一个新行中,并且在每个文本字段中,第一个框的值也将与其一起保存。

2.说明

这是表格:

enter image description here

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

enter image description here

我的表结构是

enter image description here

3. 我现在在做什么?!

3.1 - 在我的addNew.php(来自类文件(我知道我没有遵循命名约定,我的错)的构造函数中,我从我的 Controller 中获得了一个语言列表( addNewAction()).

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

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

4.我现在的代码


4.1 - 添加新 Action

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

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';
    }
}

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
        )

)

5. 可能的解决方案

这些是我认为我可以解决的问题:

5.1- 使用我的代码 BLAH。

5.2- 重构数据库,使每种语言都是一列。

6。结语

我已经尝试了很多对我来说都没有成功的事情,而我现在做这件事的方式让它看起来不成熟。

除此之外,我还在学习,我真的很想按原样解决这个问题,而无需重构数据库等。

注意事项:

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

最佳答案

下面的代码具有与您的类似的形式,并为每个翻译写出 SQL 选择/插入语句。注意,SELECT 需要将 ID 传递到第二个查询(值中表示 languageid 的部分),因为您需要根据语言名称从数据库中获取 ID。

<?php
echo '<form method="post">
<input type="text" name="LanguageKey" value="_hello"/>
<input type="text" name="EnglishUS" value="sup"/>
<input type="text" name="French" value="bon"/>
<input type="submit" value="Submit"/>
</form>';

print_r($_POST);
echo "<br />\n";

        foreach ($_POST as $key => $val)
        {
                if ($key != 'LanguageKey')
                {
                        echo $key.': '.$val."<br />\n";
                        echo "SELECT id FROM Languages where description = '$key'<br />\n";
                        echo 'INSERT INTO translation (LanguageId,LanguageKey,Translation) VALUES (\'languageid\',\''.$_POST['LanguageKey'].'\',\''.$val.'\')'."<br />\n";
                }
        }
?>

结果:

snip of page when it's run

关于php - 将所有文本字段与第一个文本字段值一起单独插入 [多对一关系],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15094542/

相关文章:

Symfony2 登录路由不断重定向到 https

php - 如何在 Symfony 的 PHPUnit Bridge 中使用 PHPUnit 扩展?

php - Symfony2 : How to convert 'Doctrine->getRepository->find' from Entity to Array?

php - Laravel 登录后重定向到上一个

php - 服务器时间和mysql数据库时间戳之间的秒数差异

php - Symfony 和 Willdurand/Hateoas Bundle - JSON 响应上没有链接

php - Doctrine :迁移:差异给出 "No changes detected in your mapping information"

error-handling - Symfony 3表单错误未显示在 Twig 模板中

php - Codeigniter 数据库日期格式

php - 如何更改 Laravel 5.1 中的环境?