[英]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.