我对manyToMany关系和orphanRemoval有一些问题。 我有两个实体,例如:
class Issuer
{
/**
* @var string
*
* @ORM\Id
* @ORM\Column(type="string", length=20)
*/
private $productCode;
/**
* @ManyToMany(targetEntity="Bid", inversedBy="issuers", cascade={"merge"}, orphanRemoval=true)
* @JoinTable(
* name="issuers_issuer_bids",
* joinColumns={
* @JoinColumn(name="product_code", referencedColumnName="product_code")
* },
* inverseJoinColumns={
* @JoinColumn(name="bid", referencedColumnName="bid")
* })
* * @var Collection
*/
private $bids;
和
class Bid
{
/**
* @var string
*
* @ORM\Id
* @ORM\Column(type="string", length=10)
*/
private $bid;
/**
* @ManyToMany(targetEntity="Issuer", mappedBy="bids")
*/
private $issuers;
场景:
在数据库中,我有两个发布者TEST和TEST2,它们都与一个bid = 1234相关,因此在joinTable中,我有两个记录TEST-> 1234和TEST2-> 1234。当我删除发布者TEST原则时,也删除了它的连接表单连接表(TEST-> 1234),出价表中的bid = 1234保持不变。到目前为止,一切都很好。在此之后,我删除了颁发者TEST2,连接表单联接表也被删除了,但投标表中的bid = 1234仍然保持不变。为什么不将其删除,因为它现在是孤儿?有人可以帮我解释这个问题吗?
更新:
我通过以下方式解决了这个问题:删除发行人时,我检查每个出价是否恰好有一个发行人。如果是这样,则意味着在删除发行人之后,该出价将成为孤立的出价,因此我也将其删除:
发行方实体注释:
/**
* @ORM\ManyToMany(targetEntity="Bid", inversedBy="issuers")
* @ORM\JoinTable(
* name="issuers_issuer_bids",
* joinColumns={
* @ORM\JoinColumn(name="product_code", referencedColumnName="product_code")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="bid", referencedColumnName="bid")
* })
* @var Collection
*/
private $bids;
出价实体注释:
/**
* @ORM\ManyToMany(targetEntity="Issuer", mappedBy="bids")
* @var Collection
*/
private $issuers;
删除存储类中的方法:
/**
* @param string $productCode
*
* @throws CantFindIssuerException
*/
public function deleteIssuer(string $productCode): void
{
/** @var IssuerEntity $issuer */
$issuer = $this->complexIssuerRepository
->getIssuerRepository()
->find($productCode);
if (null === $issuer) {
throw new CantFindIssuerException();
}
/**
* Remove orphans as orphanRemoval=true wont work properly with manyToMany relations.
* @var Bid $bid
*/
foreach ($issuer->getBids() as $bid) {
if ($bid->getIssuers()->count() === 1) {
$this->entityManager->remove($bid);
}
}
$this->entityManager->remove($issuer);
$this->entityManager->flush();
}
我希望它能对某人有所帮助:) 如果有人知道更好的解决方案,请分享。