【问题标题】:Laravel: How to have comments on multiple content types?Laravel:如何对多种内容类型进行评论?
【发布时间】:2017-03-30 02:36:52
【问题描述】:

我有一个“cmets”表,它有一个外键“content_id”和一个限定符列(如果你愿意的话)“content_type”。该列中的可能值将是例如文章,俱乐部,挑战。由于文章、俱乐部和挑战都是它们自己的内容类型(不同的表、模型、控制器等),并且在通过 hasMany 关联时,它们都有一个自动递增的主键字段(id: 1,2,..,n)我想使用 cmets 表上的 content_id 和 content_type 列来区分属于 Article 1 而不是 Club 1 或 Challenge 1 的外国 content_id 为 1 的 cmets。

我可以有 ArticleComment、ClubComment 和 ChallengeComment 的表格/类型,但我觉得这很奇怪。在 SQL 中,我只会说(基本上)select * from commments where content_id = 1 and content_type = 'article'

mysql> select * from comments where content_id = 1 and content_type = 'article';
+----+---------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | content_id | content_type | body                                                                                                                                                                                                                                                         | created_at          | updated_at          |
+----+---------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |      51 |          1 | article      | Laborum veniam placeat velit aut doloribus rem vitae quisquam. Qui occaecati dolores cupiditate et. Ut nam cupiditate vitae impedit blanditiis recusandae. Non temporibus minima quae rem occaecati temporibus molestiae. Eligendi ipsa laborum velit natus. | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
|  2 |      52 |          1 | article      | Quos et molestiae sequi aut. Dolorum eius dolorem est et sint voluptas ut. Ut ab et hic sed tenetur eaque. Neque aut qui labore animi architecto sit. Sunt excepturi laborum pariatur at dolorem est.                                                        | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
|  3 |      53 |          1 | article      | Quae ducimus minus et architecto non. Quas delectus accusantium sunt ipsam quisquam voluptas. Autem quo assumenda aut qui.                                                                                                                                   | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
|  4 |      54 |          1 | article      | Ut officiis totam doloremque et amet est. Modi et quia dolores fugit modi temporibus. Dicta dolor nemo enim. Unde quos ab voluptatum nihil ducimus reiciendis accusantium. Qui vel rem sunt sit quasi autem.                                                 | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
|  5 |      55 |          1 | article      | Velit saepe vero officia reiciendis sed nisi aut. Aliquam id dolorem eum qui molestiae dolores quam. Error adipisci possimus voluptatem aut. Sed odio quae et esse veniam quisquam est.                                                                      | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
|  6 |      56 |          1 | article      | Totam similique illum autem ut odio nihil. Placeat sunt labore suscipit sapiente et totam et. Modi autem aut ut et dolorem laudantium et. Hic laboriosam vel odio accusantium dolor quia soluta.                                                             | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
|  7 |      57 |          1 | article      | Voluptas facere dolores porro quas est. Dolorem sunt quis adipisci ut. Et et vero minus similique beatae distinctio ducimus. Voluptas iure laudantium incidunt aut.                                                                                          | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
|  8 |      58 |          1 | article      | Aut libero temporibus necessitatibus et vel sit officia sit. Esse aliquid placeat amet illum dolor aut fugiat.                                                                                                                                               | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
|  9 |      59 |          1 | article      | Repellat ducimus ipsa adipisci aliquid. Mollitia laborum ea omnis aut error error. Hic dolore qui vero nobis repellendus exercitationem amet dolores. Corrupti facere labore incidunt reprehenderit quo officia.                                             | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
| 10 |      60 |          1 | article      | Deserunt quae provident veritatis rerum unde. Voluptas dolores quia velit repellat ad ipsa saepe. Officiis corporis magni id ullam deleniti. Porro aut non veniam dolore quas suscipit.                                                                      | 2017-03-29 15:09:13 | 2017-03-29 15:09:13 |
+----+---------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+
10 rows in set (0.00 sec)

我的模型上的 cmets 关系如下所示:

    return $this->hasMany(Comment::class, 'content_id');

它会抓取所有 content_id 与文章匹配的 cmets 以及具有该 ID 的所有其他内容。

我想添加一些限定符,这样我就可以说“and content_type = 'mytype'”。我做了一些谷歌搜索,但没有找到一种直接的方法来做我认为简单的区分。

我不喜欢多种注释类型的代码异味 (IMO) 版本,我可以进行 Drupal 类型设置,其中我有一个节点/内容表来存储所有此类内容,然后引用另一个表,但我认为我会遇到类似的情况,还会增加存储这些类型的一些复杂性。

有什么线索或提示吗?

【问题讨论】:

标签: php mysql laravel laravel-5.4


【解决方案1】:

mkaatman 的评论“研究雄辩的多态关系”是解决我的问题的合适方法。非常感谢。简洁明了。

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2014-11-12
    • 2018-12-18
    • 2014-06-08
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多