Symfony保存多个实体

Symfony保存多个实体

问题描述:

我有一个带有多选下拉列表的表单。面对保存问题。 有3个实体:客户端,客户端标签,标签。客户端标签实体Symfony保存多个实体

部分:

/** 
* @ORM\Column(
*  type="date", 
*  nullable=true 
*) 
* @JMS\Groups({"list", "single"}) 
* 
* @var \DateTime 
*/ 
protected $dateExpiry; 

/** 
* @ORM\ManyToOne(targetEntity="Client") 
* @ORM\JoinColumn(name="client_id", referencedColumnName="id") 
* @JMS\Groups("list") 
* 
* @var Client 
*/ 
protected $client; 

/** 
* @ORM\ManyToOne(targetEntity="Tag") 
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id") 
* @JMS\Groups({"list", "single"}) 
* 
* @var Tag 
*/ 
protected $tag; 

然后,我对客户代码

/** 
* @param FormBuilderInterface $builder 
* @param array    $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('client') 
     ->add('tag') 
     ->add('dateExpiry', DateTimeType::class, array(
      'widget' => 'single_text', 
      'format' => 'yyyy-MM-dd',)) 
    ; 
} 

随着次选择下拉列表,我送样值的形式:

{tag: 1, client: 1, dateExpire: 2000-10-10} 

它工作得很好。

现在,当我切换到多选下拉它不工作了,所以林发送数据等:

{tag: [1, 2], client: 1, dateExpire: 2000-10-10} 

错误“标签:”这个值是无效的。“]”

我已经花了很多时间处理这个问题,请帮忙。

UPD: 进出口呈现形式,如:

{% verbatim %} 

    <md-input-container > 
     <label>Tag</label> 
     <md-content > 
      <md-select multiple class="select-position" required ng-model="formData.tags" placeholder="Select a tag"> 
       <md-option ng-value="tag.id" ng-repeat="tag in allTags">{{ tag.name }} 
       </md-option> 
      </md-select> 
     </md-content> 
    </md-input-container> 

    <mdp-date-picker mdp-placeholder="Expire date" mdp-min-date="minTagExpireDate" 
        mdp-format="YYYY-MM-DD" ng-model="formData.dateExpiry"></mdp-date-picker> 

    <div data-ng-messages="errors" role="alert" data-ng-show="form.$submitted"> 
     <div data-ng-message="tag" class="autocomplete-error">Tag not found.</div> 
    </div> 

{% endverbatim %} 

和发送它像(代码部分):

   formVm.customData = angular.copy(formVm.formData); 
       formVm.customData.client = clientId; 
       formVm.customData.dateExpiry = $filter('date')(formVm.customData.dateExpiry, 'yyyy-MM-dd'); 
       return $http.post(router.generate('api_client_tag_create'), formVm.customData); 
+0

如何切换到多选下拉菜单? – yceruto

+0

顺便说一句,允许你需要改变映射到'@ORM \ ManyToMany(targetEntity =“标记”)映射' – yceruto

+0

我已经添加了多个属性来选择 – Serghei

嘛,问题是他采用了棱角分明。在那段代码中,它看起来像标签的值来自数据库,并且在值被硬编码的文档中并非易事。

我的2美分的建议对于这种情况将在控制器使用方法:

$data = $form->getData(); 

收集所有形式的数据或

$first_name = $form->get('first_name')->getData(); 

那种语法的收集只是来自的数据一个领域。

然后,他将不得不在其上运行的实体管理器的查询,收集从数据库中的所有可能的选项的数据,然后使用

http://php.net/manual/ro/function.in-array.php

https://symfony.com/doc/current/doctrine.html

foreach($arrayOfTagsNames as $tagName) 
    if(in_array($tagName, $arrayOfTagsNames)) { 
     $tagEntity = new Tag(); 
     $tagEntity->setTag($tagName); 
     $em->persist($tagEntity); 
} 

这是我如何解决它,如果你需要从数据库中获取标签。因为您需要在后端验证用户(例如Google Chrome)是否修改了HTML输入的其他值。

+0

感谢您的输入,但是在使用angular + REST的整个项目中,我无法更改它。我需要一个明确的解决方案与表单处理程序。 – Serghei

+0

那么,对于某个字段,您可以避免使用表单构建器,只能用于该字段。这就是我的建议。因为Symfony中的多个选择有点棘手。 –