我的Laravel应用程序中有5个表。 3个主要表格为books
,places
和tags
。 books
表有一个数据透视表,可将其与代码book_tags
相关联。 places
表还有一个数据透视表:place_tags
。现在,对于每个地方,我都希望根据place_tags
和book_tags
中的标记来获取图书。
books
book_tags
places
place_tags
tags
这里是SQLFiddle
我已查看了laravel文档,而这似乎最接近的是many to many polymorphic relationship,但有了这个,只有一个带有tag_type
的数据透视表,这不是我所拥有的。
如何根据两个数据透视表中的标记构建此查询以检索每个地方的图书? MySQL中的答案也很酷,我只是不知道这看起来像是一个查询...
答案 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
我对这个问题的理解可能是错的。