当 flusing 到 mongodb 时,数组集合会自动转换为对象

Array collection is automatically converting to object when flusing to mongodb

我的 mongo db

中有以下名为 config_settings 的集合
/**
 * @MongoDB\Document(collection="config_settings", repositoryClass="AppBundle\Repository\SettingRepository")
 * @MongoDB\HasLifecycleCallbacks()
 */
class Setting
{
    /**
     * @MongoDB\Id()
     * @var ObjectId $id
     */
    protected $id;

    /**
     * @MongoDB\Field(type="string")
     * @var string $name
     */
    protected $name;

    /**
     * @MongoDB\Field(type="raw")
     * @var array<array> $value
     */
    protected $value;

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param mixed $id
     */
    public function setId($id): void
    {
        $this->id = $id;
    }

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param mixed $name
     */
    public function setName($name): void
    {
        $this->name = $name;
    }

    /**
     * @return mixed
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * @param mixed $value
     */
    public function setValue($value): void
    {
        $this->value = $value;
    }
}

我有一个表单,它接受值和名称并将其保存到数据库中

<?php

namespace AppBundle\Form;

use AppBundle\Document\Setting;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SettingCollectionType extends AbstractType
{
    /**
     * {@inheritdoc}
     * @param FormBuilderInterface<string|FormBuilderInterface> $builder
     * @param array<array> $options
     * @return void
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $choices = [];
        foreach ($options['featureKeys'] as $key) {
            $choices[$key] = $key;
        }

        $builder
            ->add('name', ChoiceType::class, [
                'label' => 'Feature',
                'choices' => $choices,
                'required' => true,
            ])
            ->add('value', CollectionType::class, array(
                'entry_type' => TextType::class,
                'prototype' => true,
                'allow_add' => true,
                'allow_delete' => true,
                'label' => false,
            ))
            ->add('submit', SubmitType::class, [
                'attr' => [
                    'class' => 'btn btn-outline-secondary'
                ],
            ]);
    }

    /**
     * {@inheritdoc}
     *  @param OptionsResolver $resolver
     *  @return void
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Setting::class,
            'featureKeys' => null
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return '';
    }
}

所以这就是问题所在,每当我尝试更新表单并更改值时,它总是刷新并将其保存为对象而不是将其保存为数组。

这是在刷新到我的数据库之前。

这是刷新到我的数据库后的结果。

这是我在控制器中保存表单的方法,非常简单。

 if ('POST' === $request->getMethod()) {
            $form->handleRequest($request);
            if ($form->isValid()) {
                $dm->persist($entity);
                $dm->flush();
             }
    }

我是不是做错了什么?

MongoDB 需要一个具有连续索引的数组才能将其作为数组保存在数据库中。很可能不是,因此它被保存为一个对象(我想是用数字键)。尝试为您的 value 字段使用 collection 类型,因为它确保您保存到数据库的内容实际上是一个列表。 collection 在幕后所做的是 additional array_values 调用,而 raw 类型按原样保存数据。