- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Symfony 和 Doctrine 相当陌生,我不确定这是否可以完成。我可以在平面 php 中做到这一点,但似乎无法找到在 Symfony/Doctrine 中做到这一点的方法。我已经解决了很多 Stack Overflow 问题并搜索了 Google,但没有任何乐趣。
我正在开发一个项目,该项目保存有关人员的基本信息,例如姓名和头衔等。它还保存有关其雇主/组织的信息。它有两个实体/表。第一个称为 CrmPerson(用于存储有关人员的信息)。该表有一个名为 personid 的主键和一个名为 orgid 的外键。第二个表 CrmOrg 用于存储有关其组织的数据。该表有一个名为orgid 的主键,没有外键。
许多人可以为一个组织工作,一个组织也可以有许多人。 IE。多对一。我已经能够构建一个单一表单,以便当您输入有关人员及其组织的信息时,当您单击“提交”时,它将将该人员信息提交到 CrmPerson 表,并将其组织信息提交到 CrmOrg 表。
但是,我有一个问题。在某些情况下,一个人可能根本不属于某个组织。多对零(我想……如果有这样的事情的话!)。当在表单中输入人员信息但未输入组织信息时,它会将该人员的信息作为新记录提交到 CrmPerson 表(如预期),但还会在 CrmOrg 表中提交一条空记录,其中任何数据中都没有数据。除了主键orgid之外的字段(如预期但不想要)。外键 orgid 也填充在链接到 CrmOrg 中新空行的 CrmPerson 表中。这可能会导致 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
的正下方即可。
关于php - Symfony Doctrine 多对零关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45547538/
下面的说法正确吗? “人最好的 friend 是狗。” public class Mann { private BestFriend dog; //etc } 最佳答案 我想说这样
我一直在 documentation 中查看 Laravel 4 中的关系我正在尝试解决以下问题。 我的数据库中有一个名为“事件”的表。该表具有各种字段,主要包含与其他表相关的 ID。例如,我有一个“
我的表具有如下关系: 我有相互链接的级联下拉框,即当您选择国家/地区时,该国家/地区下的区域将加载到区域下拉列表中。但现在我想将下拉菜单更改为基于 Ajax 的自动完成文本框。 我的问题是,我应该有多
我正在尝试弄清楚如何构建这个数据库。我之前用过Apple的核心数据就好了,现在我只是在做一个需要MySQL的不同项目。我是 MySQL 的新手,所以请放轻松。 :) 对于这个例子,假设我有三个表,Us
MongoDB 的关系表示多个文档之间在逻辑上的相互联系。 文档间可以通过嵌入和引用来建立联系。 MongoDB 中的关系可以是: 1:1 (1对1) 1: N (1对多)
您能解释一下 SQL 中“范围”和“分配单元”之间的区别或关系吗? 最佳答案 分配单元基本上只是一组页面。它可以很小(一页)或很大(很多页)。它在 sys.allocation_units 中有一个元
我有一个表 geoLocations,其中包含两列纬度和经度。还有第二个表(让我们将其命名为城市),其中包含每对唯一的纬度和经度对应的城市。 如何使用 PowerPivot 为这种关系建模?创建两个单
我想用 SQLDelight 建模关系,尤其是 一对多关系。 我有 2 张 table :recipe和 ingredient .为简单起见,它们看起来像这样: CREATE TABLE recipe
我是 Neo4J 新手,我有一个带有源和目标 IP 的简单 CSV。我想在具有相同标签的节点之间创建关系。 类似于... source_ip >> ALERTS >> dest_ip,或者相反。 "d
我正在创建一个类图,但我想知道下面显示的两个类之间是否会有任何关联 - 据我了解,对于关联,ClassA 必须有一个 ClassB 的实例,在这种情况下没有但是,它确实需要知道 ClassB 的一个变
是否可以显示其他属性,即“hasTopping”等? 如何在 OWLViz 中做到这一点? 最佳答案 OWLViz 仅 显示类层次结构(断言和推断的类层次结构)。仅使用“is-a”关系进行描述。 OW
public class MainClass { ArrayList mans = new ArrayList(); // I'm filling in this arraylist,
我想知道“多对二”的关系。 child 可以与两个 parent 中的任何一个联系,但不能同时与两个 parent 联系。有什么办法可以加强这一点吗?我也想防止 child 重复条目。 一个真实的例子
我有一个已经创建的Grails插件,旨在支持许多应用程序。该插件具有一个Employee域对象。问题在于,当在主应用程序中使用该应用程序中的域对象时,需要将其引用回Employee对象。因此,我的主应
我有一个类(class)表、类(class)hasMany部分和部分hasMany讲座以及讲座hasMany评论。如果我有评论 ID 并且想知道其类(class)名称,我应该如何在 LectureCo
我有一个模型团队,包含 ID 和名称。所有可能的团队都会被存储。 我的模型游戏有两列 team_1 和 team_2..我需要哪种关系? 我已经测试了很多,但它只适用于一列.. 最佳答案 也许你可以试
我读了很多关于 ICE 或 Corba 等技术中使用的仆人和对象的文章。有很多资源我可以读到这样的东西: 一个仆人可以处理多个对象(为了节省资源)。 一个对象可以由多个仆人处理(为了可靠性)。 有人可
嗨, 我有一个令人沮丧的问题,我在这方面有点生疏。我有两个这样的类(class): class A{ int i; String j ; //Getters and setters} class B
class Employee { private String name; void setName(String n) { name = n; } String getNam
如果您有这样的关系: 员工与其主管员工之间存在多对一关系 员工与其部门的多对一关系 部门与其经理一对一 我会在 Employee 实体中写入: @ManyToOne (cascade=CascadeT
我是一名优秀的程序员,十分优秀!