0

私は自分の質問を完全に言い換えることにしました。うまくいけば、私の問題はこの方法ではるかに明確になります。

エンティティ内に外部キーフィールドを表すフォームをどのように埋め込みますか?たとえば、プロパティには、ステータス(所有、利用可能、販売など)のテーブルへの外部キーがあります。埋め込みフォームを使用すると、埋め込みフォーム(この場合はステータス)にどの親エンティティが埋め込まれているかを理解させる方法がわかりません。フォームが送信されたときに、プロパティのステータスを作成/変更すると、外部キーの関係のみが変更されます。$ 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);

プロパティエンティティのステータスに対するプロパティのエンティティ関係:

/**
 * @var Status $status
 *
 * @ORM\ManyToOne(targetEntity="Test\Bundle\SystemBundle\Entity\Status")
 * @ORM\JoinColumn(name="StatusId", referencedColumnName="Id", nullable=false)
 */
protected $status;

これは、StatusTypeクラスを埋め込む私のPropertyTypeクラスの行です。

->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

私が見つけた 1 つの解決策は、ステータスの 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 に答える