我决定完全改写我的问题。希望我的问题能够更加清晰。
如何在实体中嵌入表示外键字段的表单?例如,属性具有状态表(拥有,可用,待售等)的外键。使用嵌入式表单,我不确定如何使我的嵌入式表单(在本例中为Status)了解父实体嵌入它是什么,以便在提交表单时,创建/更改属性上的状态仅更改外键关系。我可以通过调用$ property-> setStatus($ status)来查询属性并更改其状态,所以我相信我的Doctrine关系是正确的。
现在,我在尝试更改表单提交状态时收到此错误:
Catchable Fatal Error: Object of class Test\Bundle\SystemBundle\Entity\Status could not be converted to string in /home/vagrant/projects/test.dev/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php line 1118
我的表单创建:
$form = $this->createForm(new PropertyType(), $property);
我的Property实体中Property与Status的实体关系:
/**
* @var Status $status
*
* @ORM\ManyToOne(targetEntity="Test\Bundle\SystemBundle\Entity\Status")
* @ORM\JoinColumn(name="StatusId", referencedColumnName="Id", nullable=false)
*/
protected $status;
以下是我的PropertyType类中嵌入StatusType类的行:
->add('status', new StatusType())
这是我的StatusType表单类:
class StatusType extends AbstractType
{
public $statusType = null;
public function __construct($statusType)
{
$this->statusType = $statusType;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', 'entity', array('label' => 'Status Name',
'class' => 'Test\Bundle\SystemBundle\Entity\Status',
'property' => 'name'));
}
public function getParent()
{
return 'form';
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'Test\Bundle\SystemBundle\Entity\Status');
}
public function getName()
{
return 'status';
}
}
答案 0 :(得分:1)
在没有看到您的Status
实体的情况下,您需要向其添加__toString()
方法。为了让Symfony将实体呈现为文本,它需要知道要显示的内容。像这样......
class Status
{
public $title;
public function __toString()
{
return $this->title;
}
}
答案 1 :(得分:0)
我发现的一个解决方案是将PropertyType上的所有逻辑放在状态中。
->add('status', 'entity',
array('class' => 'Test\Bundle\SystemBundle\Entity\Status',
'property' => 'name',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('status')
->orderBy('status.name', 'ASC');
}))
而不是嵌入StatusType:
->add('status', new StatusType())
我不喜欢这种方法,因为每个使用Status的实体都会重复这个方法,但它一直有效,直到我弄清楚如何让它工作。