0

我想在我的表单中使用“实体”作为字段类型,并在下拉列表中显示记录名称,并将所选选项的 ID 保存到数据库中。

这是我的 FormType :

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;
use Acme\DemoBundle\Entity\Person;

class ContactType extends AbstractType
{
        /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('subject')
            ->add('content')
            ->add('personid','entity', array(
                                        'class' => 'Acme\DemoBundle\Entity\Person',
                                        'query_builder' => function(EntityRepository $repository) {
                                                               return $repository->createQueryBuilder('q');
                                                            }))
        ;
    }


    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\DemoBundle\Entity\Contact'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'acme_demobundle_contact';
    }
}

它从数据库中加载记录列表,并在下拉列表中以正确的选项和值(记录的 ID)在 html 表单的标签中显示它们,但不会将选项的值(记录的 ID)保存到数据库。

如果我使用 _toString(),Symfony 不会显示任何错误,但会保存“0”而不是 id,如果我不使用 _toString() 并设置“'property' => 'name'”,它会显示以下错误:

ContextErrorException: Catchable Fatal Error: Object of class <Path to Entity> could not be converted to string in /symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php line 855

我在这里关注了 Symfony 的文档:http: //symfony.com/doc/current/reference/forms/types/entity.html但没有找到解决方案。

怎么了 ?

4

3 回答 3

1

请粘贴您的整个表单类,我可以为您修复它。同时,您不应该使用常规的 'id',而应该使用关联。

更新*

public function setPerson(Person $person)
{
    $this->person = $person;
    return $this;
}

还要确保您的 ORM 设置正确(Contact.orm.xml),例如:

<many-to-one field="person" target-entity="Your\Bundle\Entity\Person">
  <join-columns>
    <join-column name="idp" referenced-column-name="id"/>
  </join-columns>
</many-to-one>
于 2014-05-05T22:29:48.967 回答
0

解决了 !

对于其他可能有同样问题的朋友,我在这里解释一下:

错误出现在我的实体关系映射中。

我遵循了这个文档:

http://symfony.com/doc/current/book/doctrine.html#relationship-mapping-metadata

并更改注释和 yml 配置,然后执行此命令行:

php app/console doctrine:generate:entities Acme

现在它工作正常!

于 2014-05-10T12:54:04.647 回答
0

问题出在您的 Acme\DemoBundle\Entity\Person 实体中。表单需要以某种方式表示每个 Person 实体,因此您需要在其中使用一个魔术方法。

请将此方法添加到实体:

public function __toString() {
  return $this->getName(); // You should return whatever field you feel is needed
}

这种方法是一种神奇的方法。更多信息可以在这里找到

于 2014-05-06T06:51:23.270 回答