1

Symfony 2 標準版でプロジェクトを構築しています。

病気エンティティを挿入するフォームを作成しました。そのフォームには 2 つの選択ボックスがあり、1 つは Groups という別のテーブルの ID にリンクされたグループと呼ばれる ManyToOne フィールドで、もう 1 つは同じ Disease テーブルにリンクされた親です。

Selectbox グループは正常に動作し、通常の変数を送信しますが、親の selectbox はエラー コードを送信していないようです。

An exception occurred while executing 
'INSERT INTO disease (parent, name, latin_name, code, notice, modified, group_id) VALUES (?, ?, ?, ?, ?, ?, ?)' 
with params {"1":{},"2":"Alamanja","3":"mirkus","4":"A011","5":"sad sada","6":"2012-01-01 00:00:00","7":"1"}:

Catchable Fatal Error: Object of class Acme\BlogBundle\Entity\Disease could not be converted to string in D:\xampp\htdocs\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php line 138

私のフォームオブジェクトは次のようになります

namespace Acme\BlogBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class DiseaseType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Acme\BlogBundle\Entity\Disease',
    ));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder->add('name');
    $builder->add('latinName');
    $builder->add('code');
    $builder->add('notice', 'textarea');
    $builder->add('parent', 'entity', array(
        'class' => 'AcmeBlogBundle:Disease',
        'property' => 'name',
        'empty_value' => '--Izaberi grupu--',
    ));
    $builder->add('group', 'entity', array(
        'class' => 'AcmeBlogBundle:Groups',
        'query_builder' => function($repository) { return $repository->createQueryBuilder('p')->orderBy('p.id', 'ASC'); },
        'property' => 'name',
    ));
    $builder->add('modified', null, array('widget' => 'single_text'));
}

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

コントローラーからフォーム オブジェクトを呼び出しています

namespace Acme\BlogBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Acme\BlogBundle\Entity\Groups;
use Acme\BlogBundle\Entity\Disease;
use Symfony\Component\HttpFoundation\Request;
use Acme\BlogBundle\Form\Type\BlogType;
use Acme\BlogBundle\Form\Type\DiseaseType;

class DiseaseController extends Controller
{

public function newAction(Request $request)
{
    // create a task and give it some dummy data for this example
    $disease = new Disease();    
    $form = $this->createForm(new DiseaseType(), $disease);

    if ($request->isMethod('POST')) {
        $form->bind($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($disease);
            $em->flush();

            return $this->redirect($this->generateUrl('disease_show'));
        }
    }else{
        return $this->render('AcmeBlogBundle:Default:newDisease.html.twig', array(
        'form' => $form->createView(),
        ));
    }
}
}

私を助けてください、私はどこでも検索しましたが、何もありません:(。

4

1 に答える 1

1
Catchable Fatal Error: Object of class Acme\BlogBundle\Entity\Disease 
could not be converted to string.

プロパティは、$parentエンティティでは文字列として、フォームではエンティティとして宣言されます。


これを解決するには、次の 2 つのオプションがあります。

オプション1

自己参照型のOneToOne 関係を作成します。

/**
 * @OneToOne(targetEntity="Acme\BlogBundle\Entity\Disease")
 * @JoinColumn(name="disease_id", referencedColumnName="id")
 */
private $parent;

オプション 2

親プロパティのデータ トランスフォーマーを作成して、疾患エンティティを文字列に変換します。


どのオプションを選択するかは、プロパティに何が必要かによって異なります。$parent文字列が必要な場合はオプション 2 に進み、エンティティ全体を保存する必要がある場合はオプション 1 に進みます。なぜそれを行う必要があるのか​​を理解するのは少し難しいです。けれど..

于 2013-02-05T12:48:52.877 に答える