繁体   English   中英

从第三个表中检索与两个数据透视表匹配的行

[英]Retrieving rows from a third table that match two pivot tables

我的Laravel应用中有5张桌子。 3个主要表是booksplacestags books表有一个数据透视表,可将其与标签book_tags places表还有一个数据透视表: place_tags 现在,对于每个地方,我都希望基于place_tagsbook_tags标签来获取书籍。

books
    book_tags
places
    place_tags
tags

这是一个SQLFiddle

我查看了laravel文档,发现这种关系最接近的是多对多关系 ,但是,只有一个透视表具有tag_type ,这不是我所拥有的。

如何基于两个数据透视表中的标签构建此查询以检索每个地方的书籍? MySQL中的答案也很酷,我只是不知道查询的样子如何...

如何基于两个数据透视表中的标签构建此查询以检索每个地方的书籍? MySQL中的答案也很酷,我只是不知道查询的样子如何...

询问

SELECT 
   books.*
 , places.*
FROM 
 book_tags
INNER JOIN 
 place_tags
ON
 book_tags.tag_id = place_tags.Tag_id

INNER JOIN 
 books
ON
 book_tags.book_id = books.id

INNER JOIN 
 places
ON
 place_tags.place_id = places.id 

结果

| id |       title | id | name |
|----|-------------|----|------|
|  1 | Science Boo |  1 | Shop |

参见演示http://sqlfiddle.com/#!9/f2674d/13

或使用类似列的别名

询问

SELECT 
   books.id AS book_id
 , books.title AS book_title
 , places.id AS place_id 
 , places.name AS place_name
FROM 
 book_tags
INNER JOIN 
 place_tags
ON
 book_tags.tag_id = place_tags.Tag_id

INNER JOIN 
 books
ON
 book_tags.book_id = books.id

INNER JOIN 
 places
ON
 place_tags.place_id = places.id 

结果

| book_id |  book_title | place_id | place_name |
|---------|-------------|----------|------------|
|       1 | Science Boo |        1 |       Shop |

参见演示http://sqlfiddle.com/#!9/f2674d/15

@RaymondNijland尚不清楚吗? 我想获取给定位置的所有书籍:P数据添加到sql :) sqlfiddle.com/#!9/f2674d/1

然后,您需要添加

WHERE
  places.name = 'name'

对上面的查询

这是我在读的书。

假设标签模型:

class Tag {
      public function books() { 
          $this->belongsToMany(Book::class);
      }
      public function places() {
          $this->belongsToMany(Place::class);
      }
}

然后,如果您需要获取所有带有特定位置的通用标签的书籍,则可以执行以下操作:

$tagsForPlace = Tag::whereHas("places", function ($query) { $query->where("id", $placeId; })->with("books")->get(); //$PlaceId is the id you are interested in.

那么您所需的书就是:

$booksWithTagsForPlace = $tagsForPlace->map(function ($tag) { 
      return $tag->books; 
})->unique("id"); //Unique to filter out duplicate books if any

我对这个问题的理解可能是错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM