【问题标题】:Single table relationship with two different tables与两个不同表的单表关系
【发布时间】:2013-12-24 10:46:20
【问题描述】:

我的数据库架构:

LIKE      PAGE    ARTICLE    
id        id      id
userid    name    text    

我的问题 - 如何使用 LIKE 表在 PAGE 表和 ARTICLE 表之间建立关系? 通常:

点赞.php:

/**
 * @ORM\ManyToMany(targetEntity="Page", inversedBy="likes")
 */
protected $pages;

/**
 * @ORM\ManyToMany(targetEntity="Article", inversedBy="likes")
 */
protected $articles;

页面.php:

/**
 * @ORM\ManyToMany(targetEntity="Like", mappedBy="pages")
 * @ORM\JoinTable(name="like_page")
 */
protected $likes;

文章.php:

/**
 * @ORM\ManyToMany(targetEntity="Like", mappedBy="article")
 * @ORM\JoinTable(name="like_article")
 */
protected $likes;

但是,两个表(页面和文章)中的 ID 列将相同。不会实现。 我该怎么办?

【问题讨论】:

  • 最好让实体存储一个 AddressID - 或者为每个引用的实体实现单独的列,并在数据库中设置一个检查约束,以确保其中一个实体是非空的。

标签: php mysql sql symfony doctrine-orm


【解决方案1】:

如果我的问题和架构正确,那么您真正想要的是:

likes (
  id,
  user_id,
  page_id,
  article_id
)
  • 赞有一个用户(作者)、页面(来源)和文章(目标)
  • 用户、页面和文章有很多赞

【讨论】:

  • 但是如果我使用这种方式,page_id 或 article_id 将为空。因此,字段(page_id 或 article_id)将是不必要的。
【解决方案2】:

基本上,丹尼斯所说的。在这种模式中,您真的不需要多对多关系。一对多关系就足够了。

点赞.php:

/**
  * @ORM\ManyToOne(targetEntity="Page")
  * @ORM\JoinColumn(name="page_id", referencedColumnName="id")
 */
protected $page;

/**
  * @ORM\ManyToOne(targetEntity="Article")
  * @ORM\JoinColumn(name="article_id", referencedColumnName="id")
 */
protected $article;

页面.php:

/**
 * @ORM\OneToMany(targetEntity="Like", mappedBy="page")
 */
protected $likes;

文章.php:

/**
 * @ORM\OneToMany(targetEntity="Like", mappedBy="article")
 */
protected $likes;

【讨论】:

  • 如果我使用这种方式,一个字段(article_id 或 page_id)将为空。堆积了不必要的字段。
  • 我认为原则不允许两个单独的实体只有一个外部 ID 字段。您可以使用全局唯一 ID 在普通 MySQL 中实现这一点,但除非有理由,否则您不应该真正这样做。另一种选择是为关系设置两个实体,PageLike 和 ArticleLike,但您应该保持简单。
【解决方案3】:

您不需要 Like.php 实体。

您的“赞”是一个实际的 User.php,其中包含 $likedPages(多对多页面)和 likeArticles(多对多文章)。 => 反面

然后您的 Page.php 有 $likes(多对多用户)和 Article.php 有 $likes(多对多用户)。 => OWNING SIDE 与连接表(likes_page_user 和 likes_article_user)

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多