[英]Retrieving rows from a third table that match two pivot tables
我的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文档,发现这种关系最接近的是多对多关系 ,但是,只有一个透视表具有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.