Symfony3.4 - collection 引用相同的实体字段失去链接关联
Symfony3.4 - collection reference same entity field lose linked association
对不起标题,很难用几个词来形容它。问题是:
我有一个客户实体,它有一个带有 Website 和 customerTrackingIds 的 OneToMany :
class Customer {
...
/**
* @var ArrayCollection
* @Serializer\Exclude()
* @ORM\OneToMany(targetEntity="AppBundle\Entity\WebSite", mappedBy="customer",cascade={"persist","remove"},orphanRemoval=true)
*/
private $webSites;
/**
* @var ArrayCollection
* @Serializer\Exclude()
* @ORM\OneToMany(targetEntity="AppBundle\Entity\CustomerTrackingId", mappedBy="customer",cascade={"persist","remove"})
*/
private $customerTrackingIds;
...
}
和网站:
class WebSite {
/**
* @var Customer
* @Serializer\MaxDepth(1)
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer", inversedBy="webSites")
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/
private $customer;
/**
* @var ArrayCollection
* @Serializer\Exclude()
* @ORM\OneToMany(targetEntity="AppBundle\Entity\CustomerTrackingId", mappedBy="website")
*/
private $customerTrackingIds;
}
客户有多个网站和多个 trackingId。每个跟踪 ID 都与客户的一个网站相关联,但同一网站可以存在多个跟踪 ID。
我在同一页面中使用 https://github.com/ninsuo/symfony-collection 来处理 website/trackingIds 的 collection,但是当我去编辑信息时,发生了一些非常奇怪的事情(至少对我而言)。
查看我的调试器 session 我看到当表单从我的控制器中的提交加载数据时:
$formCustomer = $this->createForm( CustomerFormType::class, $customer );
$formCustomer->handleRequest( $request );
if ( $formCustomer->isSubmitted() && $formCustomer->isValid() ) {
$em = $this->getDoctrine()->getManager();
$em->persist( $customer );
$em->flush();
处理请求后,TrackingIds 的所有元素都已正确设置其网站,但在网站内部,客户 link 迷路了(变为空)。
接下来发生的是,当所有数据都持久化时,我在数据库中丢失了网站 <-> 客户之间的物理关联(客户变为空)
我该如何解决这个问题?
如果您将登陆这里,我只需仔细检查我的网站集合表单类型就解决了这个问题。
自从使用 https://github.com/ninsuo/symfony-collection 以来,我创建了一个新的 FormTheme 来呈现我页面中的集合 add/delete 内容,只有一个字段用于网站集合,即网站 name.
无论如何,在我的网站集合 formType 中,我有两个字段,name 和,你猜怎么着,CUSTOMER.
由于 FormTheme 只呈现名称字段,另一个自动变为 null,所以当它由控制器处理时,他实际上做对了。
对不起标题,很难用几个词来形容它。问题是:
我有一个客户实体,它有一个带有 Website 和 customerTrackingIds 的 OneToMany :
class Customer {
...
/**
* @var ArrayCollection
* @Serializer\Exclude()
* @ORM\OneToMany(targetEntity="AppBundle\Entity\WebSite", mappedBy="customer",cascade={"persist","remove"},orphanRemoval=true)
*/
private $webSites;
/**
* @var ArrayCollection
* @Serializer\Exclude()
* @ORM\OneToMany(targetEntity="AppBundle\Entity\CustomerTrackingId", mappedBy="customer",cascade={"persist","remove"})
*/
private $customerTrackingIds;
...
}
和网站:
class WebSite {
/**
* @var Customer
* @Serializer\MaxDepth(1)
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer", inversedBy="webSites")
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/
private $customer;
/**
* @var ArrayCollection
* @Serializer\Exclude()
* @ORM\OneToMany(targetEntity="AppBundle\Entity\CustomerTrackingId", mappedBy="website")
*/
private $customerTrackingIds;
}
客户有多个网站和多个 trackingId。每个跟踪 ID 都与客户的一个网站相关联,但同一网站可以存在多个跟踪 ID。
我在同一页面中使用 https://github.com/ninsuo/symfony-collection 来处理 website/trackingIds 的 collection,但是当我去编辑信息时,发生了一些非常奇怪的事情(至少对我而言)。
查看我的调试器 session 我看到当表单从我的控制器中的提交加载数据时:
$formCustomer = $this->createForm( CustomerFormType::class, $customer );
$formCustomer->handleRequest( $request );
if ( $formCustomer->isSubmitted() && $formCustomer->isValid() ) {
$em = $this->getDoctrine()->getManager();
$em->persist( $customer );
$em->flush();
处理请求后,TrackingIds 的所有元素都已正确设置其网站,但在网站内部,客户 link 迷路了(变为空)。 接下来发生的是,当所有数据都持久化时,我在数据库中丢失了网站 <-> 客户之间的物理关联(客户变为空)
我该如何解决这个问题?
如果您将登陆这里,我只需仔细检查我的网站集合表单类型就解决了这个问题。
自从使用 https://github.com/ninsuo/symfony-collection 以来,我创建了一个新的 FormTheme 来呈现我页面中的集合 add/delete 内容,只有一个字段用于网站集合,即网站 name.
无论如何,在我的网站集合 formType 中,我有两个字段,name 和,你猜怎么着,CUSTOMER.
由于 FormTheme 只呈现名称字段,另一个自动变为 null,所以当它由控制器处理时,他实际上做对了。