在SQL中选择标记查询

时间:2014-12-11 03:38:00

标签: php sql laravel

我对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();

2 个答案:

答案 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';

}

我在这里没有测试过,但这应该适合你