REST API: 如何 post 与 fosrestbundle 的多对多关系

REST API: how to post a manytomany relationship with fosrestbundle

在我的 Symfony 4 项目中,我有 2 个实体:问题和可能的答案。
一个问题可以有很多可能的答案,一个答案可以用在很多不同的问题中。

我想 POST 一个问题,我使用 FOSRestBundle
我将如何格式化我的请求正文:

{
    "title": "my question",
    "possibleAnswers": [
        {
            "id": 1,
            "title": "my first answer"
        }
    ]
}

当我直接在数据库中创建数据并获取问题时,至少这是 FOSRestBundle 格式化答案的方式。

但我一直收到同样的错误:

Validation Failed, possibleAnswers This value is not valid

我使用 Symfony 表单来验证我的 POST,我用于问题的 possibleAnswers 字段的 fieldType 是一个 EntityType,选项 multiple 设置为 true。也许这就是错误的来源。

所以我的问题是:
如何设置请求正文的格式以添加有效的 possibleAnswers 字段?如果我当时正在做,我应该使用哪种表单类型才能工作?

抱歉没有添加任何代码,上下文实际上要复杂得多,但我很确定我的字段的 JSON 格式或表单类型是错误的。

[编辑]

这是我为 possibleanswers 字段尝试的所有表单类型

//->add('possibleAnswers', EntityType::class, array('data' => [], 'required' => false, 'multiple' => true, 'class' => PossibleAnswer::class))
  ->add('possibleAnswers', CollectionType::class, array('required' => false, 'entry_type' => EntityType::class, 'entry_options' => array('class' => PossibleAnswer::class)))
//->add('possibleAnswers', CollectionType::class, array('required' => false, 'entry_type' => PossibleAnswerType::class))
//->add('possibleAnswers', CollectionType::class, array('required' => false, 'entry_type' => PossibleAnswerType::class, 'entry_options' => array('class' => PossibleAnswer::class)))

以下是我尝试 select 可能答案的所有 JSON 格式:

{
    "title": "a postman created question",
    "answerConditions": [
        {
            "id": 1,
            "title": "already existing question",
        }
    ]
}

{
    "title": "a postman created question",
    "answerConditions": [
        {
            "possibleanswer_id": 1
        }
    ]
}

{
    "title": "a postman created question",
    "answerConditions": [
        {
            "id": 1
        }
    ]
}

{
    "title": "a postman created question",
    "answerConditions": [
        1
    ]
}

如果您想在 post 提出问题时创建 PossibleAnswer,您需要将表单中的 EntityType 替换为 CollectionType。

我经常在我的 POST 请求中使用它,当我想 post sub-object (这里是可能的答案)时,当我 post 父(问题)时:

问题表

$builder
    ->add('possibleAnswers', CollectionType::class, array(
        'entry_type'  => PossibleAnswerType::class,
        'allow_add' => true,
    ))
;

可能的答案形式:

$builder
    ->add('title')
;

而 json 看起来像:

{
    "title": "my question",
    "possibleAnswers": [
        {
            "title": "my first answer"
        }
    ]
}

希望对您有所帮助。

编辑: 如果您想在创建问题时 link 一个问题的可能答案,您可以使用这个:

问题表:

$builder
    ->add('possibleAnswer', EntityType::class, array(
        'class' => YOUR_ENTITY::class,
        'multiple' => true
    ));

而你 json 应该只包含你想要 link 的实体的 ID。应该是这样的:

{
    "title": "a postman created question",
    "answerConditions": [
        1
    ]
}