这是我的第一个问题: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为object,string 给定的 C:\ XAMPP \ htdocs中\ SYM2 \的Symfony \供应商\原则\ ORM \ LIB \原则\ ORM \ UnitOfWork.php 1358行
似乎ORM无法读取PK的字符串,任何人都不知道我必须看到什么来修复它。谢谢你的建议:)
答案 0 :(得分:0)
您的产品实体与产品类别有关。因此,您的表单要求类别是实体而不是字符串。这就是您收到错误expects parameter 1 to be object, string given
。
要避免这种情况,您可以删除setDefaultOptions
方法。如果这样做,表单类将不再知道它与某个实体类相关联。这样做的缺陷是,当您将实体传递给表单类时,它不会自动设置字段。
但是现在您可以输入类别ID并进行处理。
E.g。
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());