1

UserCompany实体之间存在一对一的关系。
在初始化(创建)用户的公司时,用户 ID 应该作为外键绑定到公司用户字段。但不是那样,我收到此错误消息:

属性“id”在“Website\CompanyBundle\Entity\User”类中不公开。也许您应该创建方法“setId()”?

当这个表单是关于公司实体时,为什么 Symfony 想要创建新用户,而用户实体只是一个应该提供用户 ID 的集合。

这是我的代码:

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;

}


公司类型.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';
    }
}


用户关系类型.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

2

您将实体映射到UserRelationType. 保存时尝试在用户实体上设置 id。如果需要选择现有用户,则必须指定数据转换器或使用实体类型。

如果要设置当前用户,最好在pre_persist之类的事件监听器中进行

于 2013-06-17T05:08:57.193 回答
2

您在实体中的属性受到保护,但您尚未为它们创建 getter/setter。(或者你没有粘贴你的完整代码)

因此,表单构建器无法访问您用户的属性。

至少public function setId($id)User.php 中的绝对缺失!

这就是为什么抛出异常说:

Maybe you should create the method "setId()"?

使用 ... 为每个属性创建 getter 和 settes

app/console doctrine:generate:entities

或手动创建它们...

User.php

public function getId()
{
    return $this->id;
}

public function setId($id)
{
    $this->id = $id;
    return $this;
}

// ...
于 2013-06-17T09:14:36.780 回答
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 回答