0

我决定完全改写我的问题。希望我的问题通过这种方式更清楚。

如何在实体中嵌入表示外键字段的表单?例如,属性具有状态表(拥有、可用、待售等)的外键。使用嵌入式表单,我不确定如何让我的嵌入式表单(在这种情况下为状态)了解嵌入它的父实体,以便在提交表单时,创建/更改属性上的状态只会更改外键关系。我可以通过调用 $property->setStatus($status) 来查询属性并更改其状态,所以我相信我的教义关系是正确的。

现在,我在尝试更改表单提交状态时收到此错误:

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';
}
}
4

2 回答 2

1

在没有看到您的Status实体的情况下,听起来您需要为其添加一个__toString()方法。为了让 Symfony 将实体呈现为文本,它需要知道要显示什么。像这样的东西...

class Status
{    
    public $title;

    public function __toString()
    {
        return $this->title;
    }
}
于 2012-08-01T23:29:58.507 回答
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 的实体都会有这个重复,但它暂时有效,直到我弄清楚如何让它工作。

于 2012-08-02T12:57:47.623 回答