1

ユーザー、作成者、トピックの 3 つのエンティティを持つシステムがあります。トピック {id}<---> 作成者{topic_id,user_id} <---> ユーザー {id,name}

エンティティ/Author.php

class Author
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\OneToOne(targetEntity="User", inversedBy="Authors")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user_id;

    /**
     * @ORM\ManyToOne(targetEntity="Topic")
     * @ORM\JoinColumn(name="topic_id", referencedColumnName="id")
     */
    protected $topic_id;

エンティティ/Topic.php

/**
 * @ORM\Entity(repositoryClass="my\myBundle\Repository\TopicRepository")
 * @ORM\Table(name="topic")
 * @ORM\HasLifecycleCallbacks()
 */
class Topic
{
    public function __construct()
    {
        $this->author = new ArrayCollection();
        $this->setStartDate(new \DateTime());
    }
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
     /**
     * @ORM\Column(type="integer")
     */
    protected $state = '0';
     /**
     * @ORM\Column(type="string", length=250)
     */
    protected $subject;
     /**
     * @ORM\Column(type="string", length=300, nullable=true)
     */
    protected $comment;
    /**
    * @ORM\OneToMany(targetEntity="Author", mappedBy="topic_id")
    */
    protected $authors;

エンティティ/User.php

/**
 * @ORM\Entity(repositoryClass="my\myBundle\Repository\UserRepository")
 * @ORM\Table(name="users")
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\OneToOne(targetEntity="Author", inversedBy="user_id")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $id;

ご覧のとおり、このような関連付けパスがあります

トピック <---> 作成者 <---> ユーザー

これで、新しいトピックを追加するフォームができました。USER テーブルの名前が入力される選択肢フィールドを表示したいと思います。私はこのようにこれを行います:

class TopicType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder->add('subject')
            ->add('authors', 'entity', array(
                'class' => 'MyBundle:User',
                'query_builder' => function($repository) { return $repository->createQueryBuilder('p'); },
                'property' => 'name',
                'multiple' => true,
                ));
    }

これにより、実際にフィールドに正しい値が入力されます。ただし、フォームを送信するとエラーが発生します。

キャッチ可能な致命的なエラー: ...\Entity\Topic::setAuthors() に渡される引数 1 は ...\Entity\User のインスタンスである必要があり、与えられた Doctrine\Common\Collections\ArrayCollection のインスタンスであり、/var/www で呼び出されます/Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php の 538 行目および .../Entity/Topic.php の 192 行目で定義

そして、私が間違った引数を渡していることは理解していますが、これを修正する方法がわかりません。エンティティ User からユーザー名を取得し、フィールドに入力し、ID を名前と関連付ける教義が必要です。フォームを送信したら、メソッド Topic.addAuthors($ids) を参照する必要があります。

お知らせ下さい...

4

1 に答える 1

0

これは、$autors次のように定義されたプロパティ セッターがあるためです。

public function setAuthors(User $author) ...

ただし、プロパティとフォーム フィールドには OneToMany 関係がmultiple = trueあるため、setter は次のように定義する必要があります。

public function setAuthors($authors) ...
于 2012-12-08T18:17:24.237 に答える