我对sql中的Joins知之甚少。我有一个表格来选择标签。我使用了多对多的关系。
我的表格结构如下:
table links
id, name, url
table tags
id, tag
table tagsmap
id, tagid, linkid
现在,如何选择与特定链接相对应的标签?我正在使用Laravel。
我试过了:
DB::table('links')
->join('tags', 'link.id', '=', 'tags.link_id')
->join('tagmaps', 'link.id', '=', 'tagmpas.link_id')
->select('tags.tag')
->get();
答案 0 :(得分:2)
只需INNER JOIN
解决问题:
SELECT tags.tag as tag, links.name as links_name, links.url as url FROM tagsmap
INNER JOIN tags ON tagsmap.tagid = tags.id
INNER JOIN links ON tagsmap.linkid = links.id
WHERE tagsmap.id = "" //GIVE YOUR CONDITION HERE
快乐编码
DB::table('tagsmap')
->join('tags', 'tagsmap.tagid', '=', 'tags.id')
->join('links', 'tagsmap.linkid', '=', 'links.id')
->select('tags.tag,links.name,links.url')
->get();
我在LAVAREL不太好,但我试图理解逻辑。据你所知,编辑我的代码LAVAREL
答案 1 :(得分:2)
向Michael posted的SQL添加where()
子句,仅返回您感兴趣的链接的标记。
获取给定tags
的所有$url
:
DB::table('links')
->join('tagmaps', 'link.id', '=', 'tagmaps.linkid')
->join('tags', 'tags.id', '=', 'tagmaps.tagid')
->select('tags.tag', 'links.url', 'tags.id') // add more fields as needed
->where('url', $url)
->get();
获取给定urls
的{{1}}:
$tag
更好的是为您的链接和标记模型设置Eloquent(many to many):
链接模型:
DB::table('tags')
->join('tagmaps', 'tag.id', '=', 'tagmaps.tagid')
->join('links', 'links.id', '=', 'tagmaps.linkid')
->select('tags.tag', 'links.url', 'tags.id') // add more fields as needed
->where('tags.tag', $tag)
->get();
标记模型:
class Link extends Eloquent {
protected $table = 'links';
public function tags()
{
// you have to specify the table and the joining IDs here, as you
// are not using what Laravel would expect.
// laravel expects the table to be called "map_tag" and the fields of
// that table to be link_id and tag_id, but it's configurable:
return $this->belongsToMany('Tag', 'tagsmap', 'linkid', 'tagid');
}
}
然后您可以通过Eloquent访问任何给定链接的标记:
class Tag extends Eloquent {
protected $table = 'tags';
}
我在这里没有测试过,但这应该适合你