我正在尝试将标记功能实现到一小块软件中,为简单起见,我实际上只想使用两个表,就像这样:
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
表,我似乎无法使其工作。我知道,我只使用两个表的计划不是很优雅,因为它增加了冗余,但仍然可以接受我的用例。那么有什么快速解决方案吗?
答案 0 :(得分:1)
这不是belongsToMany
关系,而是hasMany
。每个项目都有很多标签。
此方法的问题在于,如果将来要更改标记的名称或添加额外字段(如描述),则必须使用该标记更新所有数据库行。为标签设置专用表要容易得多,如下所示:
tags
- id (int)
- name (string)
并按如下方式设置数据透视表:
item_tag
- id (int)
- item_id (int)
- tag_id (int)
这样,您可以轻松更改标记的名称,添加额外的列等类似内容,而无需影响多个条目。
一旦你有了这三个表(couting你拥有的项目),你的belongsToMany
关系就会起作用,你甚至不需要指定主键/表的名称,只要你遵循正确的命名方案。