php - 一个实体的多个 OneToMany 关系

标签 php symfony doctrine-orm

曾几何时,在黑暗的深渊中,在 Symfony 的土地深处,有一个沮丧的程序员。他试了又试,但不知怎的,邪恶的教义一次又一次地袭来。 JoinsAssociative tablesOne-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 classclass 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/

相关文章:

php - 具有 Symfony 3/Doctrine 属性形式的一对多对一

Symfony EasyAdminBundle : Dql Filter entities in assotiation field on List not worrking

php - 在数组中选择自定义索引

php - 以编程方式设置运输方式 Woocommerce

symfony - 如何在没有渲染路线的情况下获取 Twig 中的当前绝对网址?

postgresql - Symfony PdoSessionHandler 无法按预期与 PostgreSql 一起工作

php - symfony2 突然坏了?

php - 在 Laravel 4 中更改日志级别

symfony - Twig:如何覆盖form_widget的id属性?

php - symfony用较低的函数创建数据库索引