php - 如何建模多对多关系?

标签 php sql database many-to-many

由于之前只有一点数据库方面的经验并且没有接受过正规的数据库教育,我对如何对其建模(并在 PHP 中从中检索我需要的数据)有点困惑。这就是我要建模的内容:

对于我网站上的每个项目,允许有多个标签,例如文件、上传、php、递归等。但是标签是可重复使用的,我可以有两个不同的项目,它们每个都可以有 php 标签。

我一直在努力阅读有关如何执行此操作以及是否缺乏经验或其他我不知道的内容的信息,但我似乎无法理解这个概念。显然您需要一个将两者连接在一起的中间表?

此外,一旦我有了这种关系并定义了表,我将如何做以下事情: - 检索具有特定标签的所有项目? - 检索一项的所有标签?

感谢您的帮助,如果有人可以列出任何进一步的阅读 Material 以加强我对这个概念的理解,那将是非常好的。

最佳答案

数据库部分很简单。这只是一个示例,因此您可以看到 db 的样子,而不是任何特定的 SQL 引擎查询。

CREATE TABLE posts (
    id INT PRIMARY KEY,
    subject VARCHAR(100),
    body TEXT
)

CREATE TABLE tags (
    id INT PRIMARY KEY,
    name VARCHAR(50)
)

CREATE TABLE post_tags (
    post_id INT,
    tag_id INT,
    FOREIGN KEY (post_id) REFERENCES posts (id),
    FOREIGN KEY (tag_id) REFERENCES posts (id)
)

要获取带有 yourTag 标签的项目,您只需像这样运行查询

SELECT P.*
FROM posts P 
    LEFT JOIN post_tags PT ON (PT.post_id = P.id)
    LEFT JOIN tags T ON (T.id = PT.tag_id)
WHERE T.name = 'yourTag';

要获取与 ID 为 123 的帖子关联的标签,您可以运行此查询:

SELECT T.*
FROM tags T 
    LEFT JOIN post_tags PT ON (T.id = PT.tag_id)
    LEFT JOIN posts P ON (PT.post_id = P.id)
WHERE P.id = 123;

对于 PHP 部分,您可以使用框架。许多(如果不是全部)框架可以轻松地模拟这种关系。例如在 CakePHP 中这样做是这样的:

class Post extends AppModel {
    $useTable = 'posts';
    $hasAndBelongsToMany = array(
        'Tag' => array(
            'className' => 'Tag'
            'joinTable' => 'post_tags'
            'foreignKey' => 'post_id'
            'associationForeignKey' => 'tag_id'
        )
    );
}

class Tag extends AppModel {
    $useTable = 'tags';
    $hasAndBelongsToMany = array(
        'Post' => array(
            'className' => 'Post'
            'joinTable' => 'post_tags'
            'foreignKey' => 'tag_id'
            'associationForeignKey' => 'post_id'
        )
    );
}

关于php - 如何建模多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1176014/

相关文章:

mysql - 数据库中的数学方程式和 json 响应

php - 如何通过版本 Php 文件将 wordpress 标题导航分成并排?

php - 尽管存在 isset(),但出现未定义的偏移错误

php - 上传文件并以单一形式提交文本是否可能?

database - Phplist 数据库错误 1146

mysql - 使用空值计算增长率

php - 使用mysql从数组中洗牌

optimization - 编写一个 PHP 脚本,在垂直线上生成数字 1 到 10

sql - 在一个数据库中用SQL Server 2008中的另一个数据库中的值更新记录吗?

mysql - 在 MySQL 中聊天 - 选择 - GROUP BY