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

时间:2018-05-16 11:55:13

标签: mysql laravel laravel-5 eloquent relational-database

我的Laravel应用程序中有5个表。 3个主要表格为booksplacestagsbooks表有一个数据透视表,可将其与代码book_tags相关联。 places表还有一个数据透视表:place_tags。现在,对于每个地方,我都希望根据place_tagsbook_tags中的标记来获取图书。

books
    book_tags
places
    place_tags
tags

这里是SQLFiddle

我已查看了laravel文档,而这似乎最接近的是many to many polymorphic relationship,但有了这个,只有一个带有tag_type的数据透视表,这不是我所拥有的。

如何根据两个数据透视表中的标记构建此查询以检索每个地方的图书? MySQL中的答案也很酷,我只是不知道这看起来像是一个查询...

2 个答案:

答案 0 :(得分:1)

  

如何构建此查询以检索每个地方的图书   基于两个数据透视表中的标签? 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'

以上查询

答案 1 :(得分:0)

这是我正在阅读的内容。

假设标签型号:

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

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