【发布时间】:2018-02-10 18:38:57
【问题描述】:
我想创建标签实体类,带有分类词汇,将被多个实体使用。 有没有可能用三列创建多对多关系? 我需要存储标签 ID、实体 ID 和实体类名。
所以我现在有:
<?php
/**
* Taxonomy
*
* @ORM\Table(
* name="tag_taxonomy",
* indexes={
* @ORM\Index(name="tag_taxonomy_namex", columns={"name"})
* }
* )
* @ORM\HasLifecycleCallbacks
* @ORM\Entity
*/
class Taxonomy
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="name", type="string", length=50)
*/
protected $name;
/**
* @ORM\OneToMany(targetEntity="Tag", mappedBy="taxonomy", fetch="LAZY")
*/
protected $tags;
// .....
}
标签表:
<?php
/**
* Tag
*
* @ORM\Table(
* name="tag",
* indexes={
* @ORM\Index(name="namex", columns={"name"})
* }
* )
* @ORM\HasLifecycleCallbacks
* @ORM\Entity
*/
class Tag
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
protected $id;
/**
* @var string
* @ORM\Column(name="name", type="string", length=50)
*/
protected $name;
/**
* @ORM\ManyToOne(targetEntity="Taxonomy", inversedBy="tags", fetch="LAZY")
* @ORM\JoinColumn(name="taxonomy_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $taxonomy;
// ....
}
关系表:
<?php
/**
* @ORM\Table(
* name="tag_tagging",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="tagging_idx", columns={"tag_id", "entity_name", "record_id"})
* },
* indexes={
* @ORM\Index(name="entity_name_idx", columns={"entity_name", "record_id"})
* }
* )
* @ORM\HasLifecycleCallbacks
* @ORM\Entity
*/
class Tagging
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Tag", inversedBy="tagging", cascade="ALL")
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="CASCADE")
**/
protected $tag;
/**
* @var string
* @ORM\Column(name="entity_name", type="string", length=100)
*/
protected $entityName;
/**
* @var int
* @ORM\Column(name="record_id", type="integer")
*/
protected $recordId;
// .....
}
所以我已经有了以 3 列为键的关系表: “tag_id”、“entity_name”、“record_id”。 现在知道如何与任何实体创建关系来标记表吗? 也许根本不需要标记实体?
我想知道为任何实体类型创建标签实体的最佳方法是什么。 所以我可以为用户、文章和任何东西使用标签。 当然,可以有许多关系将为每个实体创建单独的关系表,对吧?但这是正确的方法吗?
【问题讨论】:
-
您是否需要
Tag以某种方式同时成为所有这些关系的反面?只是问,因为您将inversedBy="tagging"放入您的Tagging实体中。 -
建议你看看this。这很好地说明了为什么 Doctrine 中没有与额外字段的多对多关系。遵循他们的方法将使您的编码生活更加轻松。
-
@AlanT。我没有。
-
@geoB 也许这是一个很好的例子。两个多对一而不是一个多对多可能是正确的方法;)我会检查它
-
也许不是正确的主题,但这些天我使用简单的文本数组或 jsonb 字段来处理这些事情。我说的是 PostgreSQL。
标签: symfony doctrine-orm