曾几何时,在黑暗的深渊中,在 Symfony 的土地深处,有一个沮丧的程序员。他试了又试,但不知怎的,邪恶的教义一次又一次地袭来。 Joins
、Associative tables
和 One-to-Many/Many-to-One
也让他很为难。然后,在一个下午晚些时候,StackOverflow
和它的社区前来救援。
足够的童话。我的问题是我有三个表,它们都应该引用同一个表来获取附件。
- Mail
- Order
- Ticket
这三个实体中的每一个都可以有附件。所以我做了一个附件实体。
现在,我的数据库包含以下内容
Table: mails
- id
- from
- to
- message
Table attachments
- id
- name
- path
Table: orders
- id
- ...
Table: tickets
- id
- name
- description
- ...
Table attachment_associations
- id
- type
- parent_id
- attachment_id
我想做的是能够将订单、票和邮件映射到同一个附件表。
但是,我仍然坚持如何在原则上做到这一点。
更新
我尝试使用以下方法。这似乎确实得到了我正在寻找的记录。但是我不知道如何使用这种方法自动创建、更新或删除关联表(连接表)中的记录。
/**
* @ORM\ManyToMany(targetEntity="\...\...\Entity\Attachment")
* @ORM\JoinTable(name="attachment_associations",
* joinColumns={@ORM\JoinColumn(name="parentId", referencedColumnName="id")},
* inverseJoinColumns={
* @ORM\JoinColumn(name="attachmentId", referencedColumnName="id")
* }
* )
*/
protected $attachments;
另一个更新
如果我删除邮件、订单或工单,所有相应的附件也会被删除吗?
最佳答案
一种非常容易做到这一点的方法是实现一个 mapped super class与 class table inheritance您的其他实体从中扩展。
虽然有performance implications您必须针对您的具体项目进行判断。
这是一个简单的例子:
映射的父类(super class)
<?php
namespace AcmeBundle\Model;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
*/
abstract class SuperClass
{
/**
* @var int
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @var Attachment[]
*
* @ORM\ManyToMany(targetEntity="Attachment", mappedBy="parents")
*/
protected $attachments = [];
/**
* Constructor
*/
public function __construct()
{
$this->attachments = new ArrayCollection();
}
// put setters/getters for $attachments here
}
和附件管理关联。
<?php
namespace AcmeBundle\Model;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class Attachment
{
/**
* @var int
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var SuperClass
*
* @ORM\ManyToMany(targetEntity="SuperClass", inversedBy="attachments")
*/
private $parents;
/**
* Constructor
*/
public function __construct()
{
$this->parents = new ArrayCollection();
}
}
实体只是扩展父类(super class)
<?php
namespace AcmeBundle\Model;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class Ticket extends SuperClass
{
}
关于php - 一个实体的多个 OneToMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33216200/