Php Symfony2和Doctrine2:用两个实体填充表单(一个复杂的场景)
我有5个实体:Php Symfony2和Doctrine2:用两个实体填充表单(一个复杂的场景),php,symfony,doctrine-orm,entity,symfony-forms,Php,Symfony,Doctrine Orm,Entity,Symfony Forms,我有5个实体: 用户 人, 用户关系 人格化 从属关系 以下是模式: 一些细节: 网络用户是指注册到网站的人。对于每个Web用户,都有一个个人ID 一个人可以是网络用户、作者等 每个Web用户都有0个或多个从属关系。这些从属关系是由该Web用户创建的,并链接到可访问的UserAffiliations中 WebUser还可以将他创建的关联链接到一个人(如果此人是作者),实体PersonAffiliation将被填充 我现在正试图给网络用户一个可能性,让他们把一个从属关系分配给一个作者(个
- 用户
- 人,
- 用户关系
- 人格化
- 从属关系
- 网络用户是指注册到网站的人。对于每个Web用户,都有一个个人ID
- 一个人可以是网络用户、作者等
- 每个Web用户都有0个或多个从属关系。这些从属关系是由该Web用户创建的,并链接到可访问的UserAffiliations中
- WebUser还可以将他创建的关联链接到一个人(如果此人是作者),实体PersonAffiliation将被填充
- 在实体人中
@ORM\OneToMany(targetEntity="PersonAffiliation", mappedBy="person", cascade={"persist", "remove"}) protected $affiliations;
- 当面
@ORM\ManyToOne(targetEntity="Person", inversedBy="affiliations") @ORM\JoinColumn(name="person_id", referencedColumnName="id") protected $person; @ORM\ManyToOne(targetEntity="Affiliation", inversedBy="person_affiliations") @ORM\JoinColumn(name="affiliation_id", referencedColumnName="id") protected $affiliation;
@ORM\ManyToOne(targetEntity="User", inversedBy="affiliations") @ORM\JoinColumn(name="user_id", referencedColumnName="id") protected $user; @ORM\ManyToOne(targetEntity="Affiliation", inversedBy="user_affiliations") @ORM\JoinColumn(name="affiliation_id", referencedColumnName="id") protected $affiliation;
- 在实体用户中:
@ORM\OneToMany(targetEntity="UserAffiliation", mappedBy="user") protected $affiliations; @ORM\ManyToOne(targetEntity="Person") @ORM\JoinColumn(name="person_id", referencedColumnName="id") protected $person;
- 在实体用户关系中
@ORM\ManyToOne(targetEntity="Person", inversedBy="affiliations") @ORM\JoinColumn(name="person_id", referencedColumnName="id") protected $person; @ORM\ManyToOne(targetEntity="Affiliation", inversedBy="person_affiliations") @ORM\JoinColumn(name="affiliation_id", referencedColumnName="id") protected $affiliation;
@ORM\ManyToOne(targetEntity="User", inversedBy="affiliations") @ORM\JoinColumn(name="user_id", referencedColumnName="id") protected $user; @ORM\ManyToOne(targetEntity="Affiliation", inversedBy="user_affiliations") @ORM\JoinColumn(name="affiliation_id", referencedColumnName="id") protected $affiliation;
$builder->add('affiliations', 'entity', array(
'class' => 'SciForumVersion2Bundle:PersonAffiliation',
'query_builder' => function($em) use ($person){
return $em->createQueryBuilder('pa')->where('pa.person_id = :id')->setParameter('id', $person->getId());
},
'property' => 'affiliation',
'multiple' => true,
'expanded' => true,
));
但所有这些都没有像我希望的那样正常工作
解释:当我尝试添加新的从属关系时,它仅为网络用户添加,我无法通过表单将其链接到作者(个人)
您对如何解决这个问题有什么想法,或者是一个好的教程吗?应该在Entity1Controller.php中处理这个问题:
public function createAction(Request $request)
{
$securityContext = $this->get('security.context');
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(new Entity1Type()
,null,array('attr' => array('securitycontext' => $securityContext)));
$form->bind($request);
if ($form->isValid()){
$data = $form->getData();
$entity1id = $data->getId();
$entity2id = $data->getEntity2Id();
$entity1medicaid=$data->getMedicaidID();
$entity1=$em->getRepostiory('projectBundle:Entity1')->findOneById($entity1id);
$entity2=$em->getRepository('projectprojectBundle:Entity2')->findOneById($entity2id);
if (null === $entity1){
$entity1=new entity1();
$entity1->setEntity2id($entity2id);
$entity1->setID($entity1id);
}
if (null === $entity2){
$entity2=new entity2();
$entity2->setID($entity2id);
}
$em->persist($entity1);
$em->persist($entity2);
$em->flush();
return $this->redirect($this->generateUrl('entity1', array()));
}
return $this->render('Bundle:entity1:new.html.twig', array(
'form' => $form->createView()
,'attr' => array('securitycontext' => $securityContext
)
)
);
}
您可能还必须在关联映射中设置cascade persist。Entity1.yml:
project\projectBundle\Entity\Entity1:
type: entity
table: entity1
repositoryClass: project\projectBundle\Entity\Entity1Repository
fields:
id:
type: bigint
id: true
generator:
strategy: AUTO
property:
type: string
length: 255
unique: true
manyToMany:
entity2:
targetEntity: entity2
mappedBy: entity1
cascade: ["persist"]
理论上,symfony会将entity2隐藏起来,使第二个if null子句变得不必要,但这一直困扰着我,因此我更喜欢显式地这样做。如果此表单将集合绑定到WebUser实体是因为您将此类对象传递给控制器中的表单创建,这意味着:
$webUser = new WebUser();
$this->createForm(new SubmissionAffiliationFormType(), $webUser);
或者,通过不设置DefaultOptions并明确告知它必须绑定到的data_类,将使用哪个类的决定委托给Symfony Forms:
class SubmissionAffiliationFormType extends AbstractType
{
//...
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Acme\DemoBundle\Entity\Person',
);
}
}
你有UserFormType和embedded PersonFormType吗?@Cerad,我有SubmissionAffiliationFormType和SubmissionAuthorFormType。SubmissionAffiliationFormType用于为特定用户创建新的从属关系,SubmissionAuthorFormType用于将从属关系链接到特定的人(作者)。可能只有我一个人,但我不理解这个问题。$person来自哪里?它总是用户,还是用户试图与其他人建立联系?你有什么实时的东西,我们可以点击查看问题吗?考虑到用户总是人,拥有UserAffliation和Personaffinition似乎是错误的。但这只是直觉,反映了我不理解目标。@Cerad,事实上,一个人可以是任何人,用户、作者或其他任何人。不同之处在于用户习惯于登录网站(他是注册人)。用户有自己的从属关系,但也可以创建从属关系(这就是表UserAffiliations存在的原因)。当用户创建一个作者(另一个人)时,该用户可以将从属关系分配给htis作者(个人),他可以创建新的从属关系或从UserAttachments表中选择他创建的从属关系。我目前没有任何在线信息,但如果需要,可以提供更多有关问题的详细信息。