0

这是我的第一个问题:S

我正在使用 Symfony2,但遇到以下问题

我有两个在 ManyToOne 关系中相关的实体,我想为以下实体制作一个表单

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;
   /**
     * @ORM\ManyToOne(targetEntity="Acme\ProductsBundle\Entity\ProductCategory", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $productCategory;
}

所以我做了以下“ProductType”

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('productCategory')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\ProductsBundle\Entity\Product'
        ));
    }

    public function getName()
    {
        return 'acme_hellobundle_producttype';
    }
}

当我呈现表单时,一切都很好,但现在我想将“productCategory”的小部件更改为文本小部件,因为用户需要编写作为 productCategory 主键的数字。

但是当我这样做并填写表格时,我收到以下错误。

警告:spl_object_hash() 期望参数 1 是对象,字符串在 C:\xampp\htdocs\sym2\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php 第 1358 行中给出

似乎 ORM 无法读取 PK 字符串,任何人都知道我必须看到什么来修复它。感谢您的建议:)

4

1 回答 1

0

您的产品实体与产品类别有关。因此,您的表单期望类别是实体而不是字符串。这就是您收到错误的原因expects parameter 1 to be object, string given

为避免这种情况,您可以删除setDefaultOptions方法。如果您这样做,表单类将不再知道它与某个实体类相关联。这样做的缺陷是,当您将实体传递给表单类时,它不会自动设置字段。

但是,现在您可以输入类别 ID 并进行处理。

例如

class ProductType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('productCategory');        
    }

    public function getName()
    {
        return 'acme_hellobundle_producttype';
    }
}

现在 productCategory 将自动成为文本小部件。但是,您需要在控制器中自行保存它。但为此,您可能会问另一个问题。

请注意,当您创建表单时,不要传递产品对象。有这样的

$form = $this->createForm(new ProductType(), array());
于 2013-02-16T06:51:02.393 回答