1

UserCompanyエンティティの間には 1 対 1 の関係があります。
ユーザーの会社を初期化 (作成) するときは、ユーザー ID を Company ユーザー フィールドに外部キーとしてバインドする必要があります。しかし、その代わりに、次のエラー メッセージが表示されます。

プロパティ「id」は、クラス「Website\CompanyBundle\Entity\User」で公開されていません。メソッド「setId()」を作成する必要がありますか?

このフォームが Company エンティティに関するものであり、 User エンティティがユーザーの ID を提供する単なるコレクションである場合に、Symfony が新しい User を作成したい理由。

これが私のコードです:

Company.php エンティティ:

namespace Website\CompanyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="Website\CompanyBundle\Entity\Repository\CompanyRepository")
 * @ORM\Table(name="company")
 */
class Company
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="company")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    /**
     * @ORM\Column(type="string")
     */
    protected $name;

}


CompanyType.php

class CompanyType extends AbstractType
{
    private $security;
    public function __construct(SecurityContext $security)
    {
        $this->security= $security;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $this->securityContext->getToken()->getUser();

        $builder
        ->add('user', new UserType($security))
        ->add('company_name')
        ->add('company_address')
        ...
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Website\CompanyBundle\Entity\Company'
        ));
    }

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


UserRelationType.php

class UserRelationType extends AbstractType
{
    private $user;

    public function __construct(SecurityContext $security){
        $this->user = $security->getToken()->getUser();
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('id', 'hidden', array('data' => $this->user->getId()))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Website\CompanyBundle\Entity\User'
        ));
    }

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


User.php エンティティ

namespace Website\CompanyBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * @ORM\OneToOne(targetEntity="Company", mappedBy="user")
     */
    protected $company;
}
4

3 に答える 3

1

コレクションを追加せずに、このページで説明されているように Doctrine の推移的な永続性を使用するだけでこの問題を解決しました: https://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#transitive-persistence-cascade - 操作CompanyController.php


public function createIndex(Request $request){
    $user = $this->getId();
    $company = new Company();

    if($user instanceof User){
        $company->setUser($user);
    }

    $request = $this->getRequest();
    $createForm = $this->createForm(new CompanyType(), $company);

    if('POST' === $request->getMethod())
    {
        $createForm->bindRequest($request);

        if($createForm->isValid())
        {
            $em = $this->getDoctrine()->getManager();
            $em->persist($company);
            $em->flush();
        }
    }
}



ご協力ありがとうございました

于 2013-06-17T13:22:43.607 に答える