Symfony保存多个实体

时间:2017-08-29 18:43:54

标签: php angularjs symfony symfony-2.8

我有一个带有多选下拉列表的表单。面临储蓄问题。 有3个实体:客户端,客户端标记,标记。

客户标记实体的一部分:

    /**
 * @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}

错误“tag:[”此值无效。“]”

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

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);

1 个答案:

答案 0 :(得分:0)

嗯,问题是他正在使用Angular。在我的代码中,看起来标签的值来自数据库,并且在值是硬编码的文档中并不容易。

我对这个案子的2美分建议是在控制器中使用:

 $data = $form->getData(); 

收集所有表格的数据或

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

这种语法只收集来自单个字段的数据。

然后他将不得不针对实体管理器运行查询,使用db中的所有可能选项收集数据,然后使用

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

如果您需要从db获取标记,这就是我将如何解决它。因为您需要在后端验证用户是否已修改输入其他值的HTML。