如何通过 ManyToMany 将一个实体与其自身相关联?

How can I relate an entity with itself via ManyToMany?

我的实体 "Documents" 与不同的实体相关,例如 "members"、"products" 或 "projects"。

在我的 mySQL 数据库中,这会创建 table 如下:

documents_members
documents_products 
documents_projects

现在我尝试用 manytomany 从文档到文档创建关系。所以我添加了 manytomany 文件,我希望我的数据库中有这个 table:

documents_documents

这是我的方法:

namespace App\Entity;

use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Serializer\Annotation\Groups;
/**
 * @ORM\Entity(repositoryClass="App\Repository\DocumentsRepository")
 *
 */
class Documents {

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups("documents")
     */
    private $id;


    /**
     * @ORM\ManyToMany(targetEntity="Products", inversedBy="documents")
     * @ORM\JoinColumn(name="products", referencedColumnName="id")
     * @Groups("documents")
     */
    private $products;


    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Projects", inversedBy="documents")
     * @Groups("documents")
     */
    private $projects;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Members", inversedBy="documents")
     * @Groups("documents")
     */
    private $members;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Documents", mappedBy="documents")
     */
    private $documents;

}

您需要映射关系的双方。

每个 document link 到几个其他文档,许多其他 documents 可能 link 这个。

像这样:

/**
 * Many Documents link to many Documents.
 * @ORM\ManyToMany(targetEntity="App\Entity\Documents", inversedBy="linkedFromDocuments")
 * @ORM\JoinTable(name="document_links",
 *      joinColumns={@ORM\JoinColumn(name="link_origin", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="link_destination", referencedColumnName="id")}
 *      )
 */
private $linkedDocuments;


/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Documents", mappedBy="linkedDocuments")
 */
private $linkedFromDocuments;

这将创建一个名为 document_links 的 table,包含两列:link_originlink_destination。在这些列中的每一列上,都会有一个指向 documents.

的外键

请注意,该关系是双向的。因此,您可能将 document#1 link 编辑为 document#2,并且 document#2 指向 document#1(连接 table 中的两个不同行)。您的应用程序可能需要考虑到这一点。