Laravel:只有两张桌子的多对多关系

时间:2015-10-01 21:25:20

标签: php mysql laravel laravel-4 many-to-many

我正在尝试将标记功能实现到一小块软件中,为简单起见,我实际上只想使用两个表,就像这样:

items (first table)
- id (int)
- title (string)
- description (string)

item_tag (second "pivot" table)
- item_id (int, foreign key to item.id)
- tag_name (string (!))
(primary_key(item_id, tag_name))

使用模型

<?php

class Item extends Eloquent {
    protected $fillable = array('title', 'desription');

    public function tags() {
        return $this->belongsToMany('Tag', 'item_tag', 'item_id', 'tag_name');
    }
}

<?php

class Tag extends Eloquent {
    protected $fillable = array('tag_name');

    public function items() {
        return $this->belongsToMany('Item', 'item_tag', 'item_id', 'tag_name');
    }
}

然而,由于belongsToMany函数似乎需要三个表,而且Laravel似乎想要一个tags表,我似乎无法使其工作。我知道,我只使用两个表的计划不是很优雅,因为它增加了冗余,但仍然可以接受我的用例。那么有什么快速解决方案吗?

1 个答案:

答案 0 :(得分:1)

这不是belongsToMany关系,而是hasMany。每个项目都有很多标签。

此方法的问题在于,如果将来要更改标记的名称或添加额外字段(如描述),则必须使用该标记更新所有数据库行。为标签设置专用表要容易得多,如下所示:

tags
- id (int)
- name (string)

并按如下方式设置数据透视表:

item_tag
- id (int)
- item_id (int)
- tag_id (int)

这样,您可以轻松更改标记的名称,添加额外的列等类似内容,而无需影响多个条目。

一旦你有了这三个表(couting你拥有的项目),你的belongsToMany关系就会起作用,你甚至不需要指定主键/表的名称,只要你遵循正确的命名方案。