【问题标题】:Database relationships for a flagging system in Laravel 5.2Laravel 5.2 中标记系统的数据库关系
【发布时间】:2016-06-17 20:27:33
【问题描述】:

问题

我正在构建一个应用程序,其中有很多用户可以标记的内容。让我们以用户可以标记的这些示例为例:

  • 另一个用户
  • 一张图片
  • 评论
  • 标签

所以我想要一个标记表来处理标记所有这些事情,但是根据我的愿景并坚持 Laravel 的约定,以便我可以使用关系方法,我必须为 flags 做这样的事情表...


我的“解决方案”

+----+---------+----------+--------+------------+-----------------------------+
| id | user_id | image_id | tag_id | comment_id | message                     |
+----+---------+----------+--------+------------+-----------------------------+
| 1  | 3       | null     | null   | null       | I'm building an application |
+----+---------+----------+--------+------------+-----------------------------+
| 2  | null    | 45       | null   | null       | This image is NSFW!         |
+----+---------+----------+--------+------------+-----------------------------+
| 3  | null    | null     | 234    | null       | Tag includes bad content... |
+----+---------+----------+--------+------------+-----------------------------+
| 4  | null    | null     | null   | 125        | Spamming!!!                 |
+----+---------+----------+--------+------------+-----------------------------+

现在这样,这个标记系统根本无法扩展!如果我希望将来能够标记事物,我必须添加一列并对其进行映射等。

我不喜欢这种凌乱的解决方案,而且我想不出另一种 Laravel-y 方式来做到这一点!


我需要想出一种可扩展的方式,以 Laravel 5.2 的方式使用一个表处理多个事物的标志。

【问题讨论】:

  • 我会考虑polymorphic relationship。带有user_idmessageflaggable_idflaggable_typeflags 表。那里的最后一列将指示它属于哪个表。 Eloquent 让这一切变得非常容易使用。
  • 您没有想到创建一个名为 entity_types 的表,您可以在其中添加行,其中包含诸如 userimagetag、@ 等值的行987654333@ 然后不是有 X 列,而是引用 entity.id 和另一个包含该值的列?这个设计没有任何 Laravel 风格,Laravel 可以帮助你,而不是为了它而强制执行一些奇怪和困难的事情。

标签: php database laravel laravel-5 laravel-5.2


【解决方案1】:

你应该看看多态关系:https://laravel.com/docs/master/eloquent-relationships#many-to-many-polymorphic-relations

您为flags 创建一个表和一个名为flaggable 的表。 Flaggable 具有 idflag_idflaggable_typeflaggable_id 列。那么一个条目可能是

1 | 1 (id of the flag) | App\Image (type of flaggable) | 45 (ID of image)

【讨论】:

  • 这正是 OP 所需要的。
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2017-01-26
相关资源
最近更新 更多