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);
嘛,问题是他采用了棱角分明。在那段代码中,它看起来像标签的值来自数据库,并且在值被硬编码的文档中并非易事。
我的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输入的其他值。
感谢您的输入,但是在使用angular + REST的整个项目中,我无法更改它。我需要一个明确的解决方案与表单处理程序。 – Serghei
那么,对于某个字段,您可以避免使用表单构建器,只能用于该字段。这就是我的建议。因为Symfony中的多个选择有点棘手。 –
如何切换到多选下拉菜单? – yceruto
顺便说一句,允许你需要改变映射到'@ORM \ ManyToMany(targetEntity =“标记”)映射' – yceruto
我已经添加了多个属性来选择 – Serghei