繁体   English   中英

Symfony主义多对零关系

[英]Symfony Doctrine Many to Zero Relationship

我对Symfony和Doctrine相当陌生,我不确定是否可以做到。 我可以在平面php中执行此操作,但似乎无法在Symfony / Doctrine中找到执行此操作的方法。 我经历了大量的Stack Overflow问题,并搜寻了Google,但并不高兴。

我正在一个项目中,该项目保存有关人员的基本信息,例如其姓名和职务等。它还保存有关其雇主/组织的信息。 它有两个实体/表。 第一个称为CrmPerson(用于存储有关人员的信息)。 该表有一个主键称为personid,一个外键称为orgid。 第二张表CrmOrg用于存储有关其组织的数据。 该表具有一个称为orgid的主键,没有外键。

许多人可以为一个组织工作,而一个组织可以有很多人。 即多对一。 我已经能够构建一个表单,以便当您输入有关人员及其组织的信息时,单击“提交”时,它将人员信息提交给CrmPerson表,并将其组织信息提交给CrmOrg表。

但是,我有一个问题。 在某些情况下,一个人可能根本不属于某个组织。 多数为零(我想...如果有这样的事情!)。 当个人信息输入到表单中但未输入组织信息时,它会将个人信息作为新记录提交到CrmPerson表中(如预期的那样),但也会在CrmOrg表中提交空记录,而任何除主键orgid之外的其他字段(符合预期,但不需要)。 外键orgid也填充在CrmPerson表中,该表链接到CrmOrg中的新空行。 这可能会导致CrmOrg中成百上千的空记录。

是否有可能做到这一点,以便如果将个人信息添加到表单中而不添加公司信息,则仅向CrmPerson表提交一条记录,其中包括外键orgid的空/空值,并且不向CrmOrg添加任何内容桌子吗?

这是我尝试使用的代码(删除了与该问题无关的部分):

CrmOrg.php

<?php
// src/AppBundle/Entity/CrmOrg.php

namespace AppBundle\Entity;

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

/**
  * CrmOrg
  *
 * @ORM\Table(name="crm_org", indexes={@ORM\Index(name="index_org", columns=
 {"orgid", "memberid"})})
 * @ORM\Entity
 */
class CrmOrg
{
    /**
     * @var integer
     *
     * @ORM\Column(name="orgid", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $orgid;

    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\CrmPerson", 
mappedBy="crmorg")
     */
    protected $crmpersons;

    /**
     * CrmOrg constructor.
     */
    public function __construct()
    {
        $this->crmpersons = new ArrayCollection();
    }

CrmPerson.php

/**
 * @var integer
 *
 * @ORM\Column(name="personid", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $personid;

/**
 * @var \AppBundle\Entity\CrmOrg
 *
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\CrmOrg")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="orgid", referencedColumnName="orgid")
 * })
 */
private $orgid;



/**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\CrmOrg", inversedBy="crmpersons", cascade={"persist"})
 * @ORM\JoinColumn(name="orgid", referencedColumnName="orgid", nullable=false)
 */
protected $crmorg;

PersonController.php

<?php
// src/AppBundle/Entity/PersonController.php

namespace AppBundle\Controller;

use AppBundle\Form\CrmPersonType;
use AppBundle\Entity\CrmPerson;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Doctrine\ORM\EntityManagerInterface;




class PersonController extends Controller
{

    /**
     * @var EntityManagerInterface
     */
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

/**
 * @Route("/user/person_add", name="person_add")
 */
public function personAddAction(Request $request)
{
    $form = $this->createForm(CrmPersonType::class);



    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $em = $this->getDoctrine()->getManager();

        $crmperson = $form->getData();

        $em->persist($crmperson);
        $em->flush();

        return $this->redirectToRoute('lead');
    }

    return $this->render(':lead:lead.add.html.twig', [
        'leadForm' => $form->createView()
    ]);
}

CrmPersonType

<?php
// src/AppBundle/Entity/CrmPersonType.php


namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use AppBundle\Entity\CrmPerson;
use AppBundle\Entity\CrmOrg;
use AppBundle\Form\CrmOrgType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;


class CrmPersonType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', ChoiceType::class, array(
                  'choices'  => array(
                        'Mr' => 'Mr',
                        'Miss' => 'Miss',
                        'Mrs' => 'Mrs',
                        'Ms' => 'Ms',

                                    ),
                  'required'   => false,
            ))

            ->add('firstName', TextType::class, array(
                  'required'   => false,
                  )) 
            ->add('middleNames', TextType::class, array(
                  'required'   => false,
                  )) 
            ->add('surname', TextType::class, array(
                  'required'   => false,
                  ))
            ->add('tel', TextType::class, array(
                  'required'   => false,
                  ))
            ->add('mob', TextType::class, array(
                  'required'   => false,
                  ))
            ->add('email', TextType::class, array(
                  'required'   => false,
                  ))
            ->add('jobTitle', TextType::class, array(
                  'required'   => false,
                  ))

            ->add('crmorg', CrmOrgType::class)
            ->add('submit', SubmitType::class, [
                'label' => 'Save',
                'attr'  => [
                    'class' => 'btn btn-success'
                ]
            ])
        ;
    }

CrmOrgType

<?php
// src/AppBundle/Entity/CrmPersonType.php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class CrmOrgType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('companyName', TextType::class, array(
                  'required'   => false,
                  ))
            ->add('companyWebsite', TextType::class, array(
                  'required'   => false,
                  ))
            ->add('industry', TextType::class, array(
                  'required'   => false,
                  )) 


        ;
    }

$orgid @JoinColumn批注中,添加nullable=true参数:

@ORM\JoinColumn(name="orgid", referencedColumnName="orgid", nullable=true)

这样,您不必将用户与任何组织相关联。

顺便说一句,如果只有一个连接列,则无需在@JoinColumns放置@JoinColumn批注。 你可以简单地把@JoinColumn右下方标注@ManyToOne

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM