请问这种情况下表关系如何设计

现在有个系统,用户可以点赞(喜欢或者不喜欢)文章、回复和其他用户。表结构如下:

用户-users : id,
文章-articles: id,
回复-replies: id,
点赞-votes: id, name(喜欢或不喜欢),

目前个人的想法:user, article, reply 与 vote 为“多对多多态”关系。那么就有中间表votables, 表结构如下:
votables:vote_id, votable_id, votable_type

现在想把点赞与发出点赞的用户用“多对多”的关系关联起来,请问该把user_id 放在哪?

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 26
giao哥

放 votables 表

1年前 评论
yanyin (楼主) 1年前

直接拉个表articles_users_votes 代替点赞表
article_id user_id voteType(喜欢/不喜欢 tinyInt) 然后这三个建个唯一索引(如果只能点赞一次的话)就好了 。
然后articles表里面加一个点赞统计数量的字段就好了

1年前 评论
yanyin (楼主) 1年前
Aroad (作者) 1年前
yanyin (楼主) 1年前

是这么搞的吗?

回复点赞表(回复ID 主键,用户ID 主键,点赞ID)

1年前 评论

votes 表不是必要的,因为这只是一个枚举值,dislike 或者 like。

votables:user_id, votable_id, votable_type, type(字符串 dislike 或者 like)

代码你参考一下,没测试,随手写的:

<?php

class User{
    // 已经投票的文章
    public function votedArticles()
    {
        return $this->morphedByMany(Article::class, 'votable');
    }

    // 已经投票的回复
    public function votedReplies()
    {
        return $this->morphedByMany(Reply::class, 'votable');
    }

    // 已经投票的用户
    public function votedUsers()
    {
        return $this->morphedByMany(self::class, 'votable');
    }

    // 投了这个用户的票的用户
    public function votingUsers()
    {
        return $this->morphToMany(self::class, 'votable');
    }
}

class Article{
    // 投了这篇文章的票的用户
    public function votingUsers()
    {
        return $this->morphToMany(User::class, 'votable');
    }
}

class Reply{
    // 投了这个回复的票的用户
    public function votingUsers()
    {
        return $this->morphToMany(User::class, 'votable');
    }
}


// 文章1被用户1 like
$article = Article::find(1);
$user = User::find(1);
$article->votingUsers()->attach($user->id, ['type' => 'like']);

// 文章1被用户1 dislike
$article = Article::find(1);
$user = User::find(1);
$article->votingUsers()->attach($user->id, ['type' => 'dislike']);


// 用户1被用户2 like
$user = User::find(1);
$votedUser = User::find(2);
$user->votingUsers()->attach($votedUser->id, ['type' => 'like']);


// 用户1被用户2、用户3、用户4 like
$user = User::find(1);
$votedUser2 = User::find(2);
$votedUser3 = User::find(3);
$votedUser4 = User::find(4);
$user->votingUsers()->attach([
    $votedUser2->id => ['type' => 'like'],
    $votedUser3->id => ['type' => 'like'],
    $votedUser4->id => ['type' => 'like'],
]);
1年前 评论
yanyin (楼主) 1年前
yanyin (楼主) 1年前
ㅤㅤ (作者) 1年前
yanyin (楼主) 1年前
yanyin (楼主) 1年前
ㅤㅤ (作者) 1年前
pan_zoe 1年前
yanyin (楼主) 1年前
ㅤㅤ (作者) 1年前
yanyin (楼主) 1年前
ㅤㅤ (作者) 1年前
ㅤㅤ (作者) 1年前
yanyin (楼主) 1年前
ㅤㅤ (作者) 1年前
yanyin (楼主) 1年前

composer require spatie/laravel-tags

spatie.be/docs/laravel-tags/v4/bas...

这个基本能解决问题

1年前 评论
yanyin (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!